elasticsearch Elasticsearch术语过滤器,但用于前缀
我有一个要过滤多个值的字段。我目前正在使用
elasticsearch Elasticsearch术语过滤器,但用于前缀,
elasticsearch,
elasticsearch,我有一个要过滤多个值的字段。我目前正在使用terms过滤器执行此操作: "filter" : { "terms" : { "user" : ["kimchy", "elasticsearch"]} } 但是我希望过滤器匹配前缀和整个术语,类似这样(前缀只是我想要的伪编码): 还是必须使用多个或过滤器 "filter" : { "or" : { "filters" : [
terms
过滤器执行此操作:
"filter" : {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
但是我希望过滤器匹配前缀和整个术语,类似这样(前缀
只是我想要的伪编码):
还是必须使用多个或过滤器
"filter" : {
"or" : {
"filters" : [
{
"prefix" : { "user" : "kim" }
},
{
"prefix" : { "user" : "elast" }
}
],
ES
没有类似于的前缀,但是
1) 您可以使用而不是编写多个或过滤器
您可以将查询编写为
{
"query": {
"query_string": {
"default_field": "users",
"query": "kim* OR elas*"
}
}
}
但是有一个问题,如果您的用户
字段映射为未分析
,则它将找不到Kimchy,默认情况下,Elasticsearch为小写扩展的
项,并且它将所有前缀都小写
为了让它100%工作,我建议使用with,这样我们就可以进行不区分大小写的搜索,然后上面的查询将为您提供所需的结果。您可以使用或添加更多前缀
2) 另一种方法是将关键字标记器
与小写字母
和混合使用。假设您使用minu-gram:2
和max-gram:7
,那么您可以使用术语
查询本身像这样执行多前缀查询
"filter": {
"terms": {
"user": ["kim", "elast"]
}
}
希望这有帮助 第二种方法更合理。。在第一种方法中,您使用了正则表达式,它的速度有点慢,查询字符串越慢,越容易出现语法错误。@AnirudhModi前缀搜索在内部由ES以相同的方式完成,我认为,查询字符串在内部也会转换为bool。我同意第二种方法会更快。前缀搜索的工作原理不同。。它似乎在搜索时进行了类型转换,但它有了最大扩展,这使得它非常严格,因为你不会得到想要的结果…最好使用edge ngram
"filter": {
"terms": {
"user": ["kim", "elast"]
}
}