elasticsearch Elasticsearch术语过滤器,但用于前缀,elasticsearch,elasticsearch" /> elasticsearch Elasticsearch术语过滤器,但用于前缀,elasticsearch,elasticsearch" />

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"]
    }
}