1. 程式人生 > >Elasticsearch 複合查詢——多字串多欄位查詢

Elasticsearch 複合查詢——多字串多欄位查詢

# 前言 有時我們在搜尋電影的時候,包含了多個條件,比如主演是周星馳,打分8分以上,上映時間是1990年~2001年的,那麼Elasticsearch又該如何幫我們做查詢呢?這裡我們可以用 bool 查詢來實現需求。這種查詢將多查詢組合在一起,成為使用者自己想要的 bool 查詢。 # bool 查詢 一個 bool 查詢,可以包含一個或多個查詢語句進行組合。 有4種引數 - must:文件**必須**匹配這些條件才能被包含進來。貢獻算分。 - should:文件**選擇性**匹配,如果滿足這些語句中的任意語句,將增加 _score ,否則,無任何影響。貢獻算分。 - must_not:文件**必須不**匹配這些條件才能被包含進來。 - filter:必須 匹配,但它以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文件。不貢獻算分。 # 基本語法 - bool 裡面的子查詢繼續巢狀 bool 查詢 - 子查詢可以以任意順序出現 - 如果沒有 must 語句,那麼至少需要能夠匹配其中的一條 should 語句。但如果存在至少一條 must 語句,則對 should 語句的匹配沒有要求。 - must等可以跟一個物件(“{}”),也可以跟陣列(“[]”) ``` { "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }} ], "filter": { "bool": { "must": [ { "range": { "date": { "gte": "2014-01-01" }}}, { "range": { "price": { "lte": 29.99 }}} ], "must_not": [ { "term": { "category": "ebooks" }} ] } } } } ``` 一個航班查詢的例子,搜尋去往美國的,當地天氣是晴朗的,不從日本出發的,票價小於等於1000的航班。 ``` GET kibana_sample_data_flights/_search { "size": 5, "query": { "bool": { "must": [ { "term": { "DestCountry": "US" } }, { "term": { "DestWeather": "Sunny" } } ], "must_not": { "term": { "OriginCountry": "JP" } }, "filter": { "range": { "AvgTicketPrice": { "lte": 1000 } } } } } } ``` # 控制相關性 那麼多個欄位的查詢,我們該如何影響其相關性的算分呢? ## 層級巢狀 同一層級下的欄位是競爭關係,具有相同權重,可以通過巢狀改變對算分的影響。 ``` GET animals/_search { "query": { "bool": { "should": [ {"term": {"text": "brown"}}, {"term": {"text": "red"}}, {"term": {"text": "quick"}}, {"term": {"text": "dog"}} ] } } } GET animals/_search { "query": { "bool": { "should": [ {"term": {"text": "brown"}}, {"term": {"text": "red"}}, {"bool": { "should": [ {"term": {"text": "quick"}}, {"term": {"text": "dog"}} ] } } ] } } } ``` ## boosting 控制欄位的權重,可以使用boosting,預設值是1,可正可負。 - 當boost>1時,打分的相關性相對提升 - 當0