elasticsearch - 按值过滤聚合
问题描述
我正在尝试创建一个通配符搜索(是的代替 ngram,但它的数量会非常低),它将解析来自特定字段的值,按它们的频率排序。
如果我有一个具有属性的文档列表color
,其值为“blue”、“bluish”、“red”、“redish”等,我想搜索类似于"*blu*"
.
我可以先通过该通配符过滤文档,然后使用术语 agg 来获取值及其用法。
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"color": {
"value": "*blu*"
}
}
}
]
}
},
"aggs": {
"profile_hits": {
"terms": {
"field": "color.keyword"
}
}
}
}
此查询将返回结果:"blue", "bluish"
。这正是我想要的。
但是,如果颜色字段包含多个值,则会出现问题。假设有一个颜色值为 的文档["blue", "red"]
。现在,当我搜索时,"*blu*"
我将匹配该文档,这意味着我的搜索"*blu*"
将返回"blue", "red"
。
我明白为什么会这样。我想知道是否有一种方法可以通过相同的通配符进一步过滤 aggs,因此它不会对不匹配的值进行 aggs "*blu*"
。或者这是我需要在应用程序中做的事情?
解决方案
includes
正则表达式过滤器在这里对您有用吗?还有免费的excludes
。
"aggs": {
"profile_hits": {
"terms": {
"field": "color.keyword",
"includes": "*blu*"
}
}
}
推荐阅读
- javascript - Android 5.1 设备重置后 Cordova 应用程序未捕获的 SyntaxError
- reactjs - 如何在反应中处理 URL 参数
- ruby-on-rails - 即使未请求,选择查询也会在结果中添加 attr_encrypted 属性
- android - 打开图库并选择图像后,Android Toast 未显示
- node.js - 有没有办法使用 firebase admin sdk 的 ProjectManagement 服务从 Firebase 项目中删除 android 或 ios 应用程序?
- fetch - 有没有办法在服务工作者中导入或加载库?
- python-3.x - Python:使用 selenium 登录网站?
- java - 如何使用 Stream 比较 2 个列表并获取元素形式比较列表?
- java - okHTTP3 返回 SSLHandshakeException:握手失败
- java - Spring Boot MongoDB - 无法通过 ObjectId 访问集合数据