2017-09-25 76 views
0

我有一個簡單的查詢如何將query_string與elasticsearch中的過濾器一起使用?

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     }, 
     { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

我想給query_string變爲過濾器。我不知道如何

 { 
      "bool": { 
      "should": { 
       "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
       } 
      } 
      } 
     } 

轉換成類似

 "filter": { 
     "query_string": { 
       "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
        "city_*" 
       ] 
      } 
     } 

,並確保它過濾所有這個城市henderson OR Boulder City OR Sloan並以此各個領域city_*.keyword

任何想法?

回答

0

變化

{ 
     "bool": { 
     "should": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

{ 
     "bool": { 
     "filter": { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
      "fields": [ 
       "city_*" 
      ] 
      } 
     } 
     } 
    } 

這是否讓你期望的行爲?在過濾器下使用相同的查詢應該可以得到與應該相同的結果,但計分不會被查詢加權。

編輯 - 還有一個建議,我會做是爲了您的查詢調整到這一點:

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "query_string": { 
      "query": "henderson OR Boulder City OR Sloan", 
       "fields": [ 
       "city_*" 
       ] 
      } 
     } 
     ]   
    } 
    } 
} 

編輯2 - 您可以移動使用QUERY_STRING離開,這是否給你任何速度增加? (你可能應該更改爲「應該」被嵌套在過濾器中,以及如果你想讓他們不計分)

GET data/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "prefix": { 
      "last_name": "test" 
      } 
     } 
     ], 
     "should": [ 
     { 
      "match": { 
      "city_*": "henderson" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Boulder City" 
      } 
     }, 
     { 
      "match": { 
      "city_*": "Sloan" 
      } 
     } 
     ]   
    } 
    } 
} 
+0

它確實給我同樣的結果..我的想法使用'filter'是使查詢速度更快,但它似乎需要相同的時間 – Patrioticcow

+0

過濾器,並應在您提供的示例中給出相同的結果(並假設費用大致相同)。唯一的區別是應該得分並且過濾器不會。 – Miek

+0

@Patrioticcow所以這是一個稍微不同的問題,而不僅僅是更新現有的查詢來充當過濾器,但是您可以採取一些方法。最好是完全替換查詢字符串操作,並將單個詞搜索爲數組。 – Miek

相關問題