Elasticsearch术语过滤,但用于前缀

时间:2015-12-29 01:12:04

标签: elasticsearch

我有一个字段,我想过滤多个值。我目前使用terms过滤器执行此操作:

"filter" : {
            "terms" : { "user" : ["kimchy", "elasticsearch"]}
        }

但是我希望过滤器匹配前缀和整个术语,像这样(prefixes只是我假想我想要的):

 "filter" : {
            "prefixes" : { "user" : ["kim", "elast"]}
        }

或者我是否必须使用多个or过滤器?

"filter" : {
            "or" : {
                "filters" : [
                    {
                        "prefix" : { "user" : "kim" }
                    },
                    {
                        "prefix" : { "user" : "elast" }
                    }
                ],

1 个答案:

答案 0 :(得分:2)

ES没有prefixes

之类的内容

1)您可以使用query string query而不是撰写多个or filters

您可以将查询编写为

{
  "query": {
    "query_string": {
      "default_field": "users",
      "query": "kim* OR elas*"
    }
  }
}

但是有一个问题,如果您的user字段被映射为not_analyzed,那么它将无法找到 Kimchy ,默认情况下 Elasticsearch { {1}}为真,它会小写所有前缀。

为了使其100%正常工作,我建议您使用keyword tokenizer lowercase token filter,以便我们可以进行不区分大小写的搜索,之后上述查询将为您提供所需的结果。您可以使用lowercase_expanded_terms

添加更多前缀

2)另一种方法可能是ORkeyword tokenizeredgengram token filter混合。假设您使用lowercasemin_gram : 2,那么您可以使用max_gram : 7查询本身就像多个前缀查询一样

terms

希望这有帮助!