2015-12-29 35 views
0

我有一个字段,我想筛选多个值。我目前正在做这与terms过滤器:Elasticsearch术语过滤器,但前缀为

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

但我希望该过滤器匹配的前缀,以及整体而言,这样的事情(prefixes只是我pseudocoding我想要的):

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

还是我不得不求助于多个or过滤器?

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

回答

2

ES没有像prefixes

1东西),你可以使用query string query而不是写多or filters

你可以写你的查询作为

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

有一个问题虽然,如果您的user字段映射为not_analyzed那么它不会找到KimchyElasticsearch默认lowercase_expanded_terms是真实的,它会小写所有的前缀。

对于这项工作100%,我会建议使用keyword tokenizerlowercase token filter,使我们可以做出区分大小写的搜索,之后上面的查询会给你想要的结果。您可以添加更多前缀OR

2)另一种方法可以是keyword tokenizerlowercaseedgengram token filter混合。比方说,你使用min_gram : 2max_gram : 7那么你可以使用terms查询本身像多个前缀这样的查询

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

希望这有助于!

+0

第二种方法更加合理..因为在第一种方法中你使用的正则表达式,往往会有点慢,更多的查询字符串更容易受到语法错误的影响。 –

+0

@AnirudhModi前缀搜索完成相同由ES内部方式我认为,也query_string将内部转换为布尔。我同意第二种方法会更快。 – ChintanShah25

+0

前缀搜索工作方式不同..它似乎在搜索时执行该类型,但它已获得max_expansion,这使得它非常严格,因为在您不会得到期望的结果...它最好使用边缘ngram –