2015-12-29 59 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 –