我正在尝试创建一个通配符搜索(是,代替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,因此它不会对与"*blu*"
不匹配的值进行aggs处理。还是我需要在应用程序中做这件事?
答案 0 :(得分:1)
includes
正则表达式过滤器在这里对您有用吗?还有免费的excludes
。
"aggs": {
"profile_hits": {
"terms": {
"field": "color.keyword",
"includes": "*blu*"
}
}
}