python ElasticSearch 組合查詢
阿新 • • 發佈:2018-12-07
{ "query": { "bool": { "must": { "match": { "title": "quick" }}, "must_not": { "match": { "title": "lazy" }}, "should": [ { "match": { "title": "brown" }}, { "match": { "title": "dog" }} ] } } }
- must: 文件必須完全匹配條件
- should: should下面會帶一個以上的條件,至少滿足一個條件,這個文件就符合should
- must_not: 文件必須不匹配條件
-
match
最簡單的一個match例子:
查詢和"我的寶馬多少馬力"這個查詢語句匹配的文件。
{ "query": { "match": { "content" : { "query" : "我的寶馬多少馬力" } } } }
上面的查詢匹配就會進行分詞,比如"寶馬多少馬力"會被分詞為"寶馬 多少 馬力", 所有有關"寶馬 多少 馬力", 那麼所有包含這三個詞中的一個或多個的文件就會被搜尋出來。
並且根據lucene的評分機制(TF/IDF)來進行評分。match_phrase
比如上面一個例子,一個文件"我的保時捷馬力不錯"也會被搜尋出來,那麼想要精確匹配所有同時包含"寶馬 多少 馬力"的文件怎麼做?就要使用 match_phrase 了
{ "query": { "match_phrase": { "content" : { "query" : "我的寶馬多少馬力" } } } }
完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop。
{ "query": { "match_phrase": { "content" : { "query" : "我的寶馬多少馬力", "slop" : 1 } } } }
multi_match
如果我們希望兩個欄位進行匹配,其中一個欄位有這個文件就滿足的話,使用multi_match
{ "query": { "multi_match": { "query" : "我的寶馬多少馬力", "fields" : ["title", "content"] } } }
但是multi_match就涉及到匹配評分的問題了。
-
控制精度編輯
所有
must
語句必須匹配,所有must_not
語句都必須不匹配,但有多少should
語句應該匹配呢? 預設情況下,沒有should
語句是必須匹配的,只有一個例外:那就是當沒有must
語句的時候,至少有一個should
語句必須匹配。就像我們能控制
match
查詢的精度 一樣,我們可以通過minimum_should_match
引數控制需要匹配的should
語句的數量, 它既可以是一個絕對的數字,又可以是個百分比:GET /my_index/my_type/_search { "query": { "bool": { "should": [ { "match": { "title": "brown" }}, { "match": { "title": "fox" }}, { "match": { "title": "dog" }} ], "minimum_should_match": 2 } } }
- 參考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/bool-query.html
- https://www.cnblogs.com/yjf512/p/4897294.html