es dsl多条件组合查询(转)
【README】在不評分的情況下, 推薦使用filter 過濾查詢,因為不評分,查詢性能優于評分性能;
轉:https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-queries-together.html
下面截圖是我認為最有價值的地方。
【2】全文如下:
現實的查詢需求從來都沒有那么簡單;它們需要在多個字段上查詢多種多樣的文本,并且根據一系列的標準來過濾。為了構建類似的高級查詢,你需要一種能夠將多查詢組合成單一查詢的查詢方法。
你可以用?bool?查詢來實現你的需求。這種查詢將多查詢組合在一起,成為用戶自己想要的布爾查詢。它接收以下參數:
must
文檔?必須?匹配這些條件才能被包含進來。
must_not
文檔?必須不?匹配這些條件才能被包含進來。
should
如果滿足這些語句中的任意語句,將增加?_score?,否則,無任何影響。它們主要用于修正每個文檔的相關性得分。
filter
必須?匹配,但它以不評分(查詢性能優于其他評分查詢)、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文檔。
由于這是我們看到的第一個包含多個查詢的查詢,所以有必要討論一下相關性得分是如何組合的。每一個子查詢都獨自地計算文檔的相關性得分。一旦他們的得分被計算出來,?bool?查詢就將這些得分進行合并并且返回一個代表整個布爾操作的得分。
下面的查詢用于查找?title?字段匹配?how to make millions?并且不被標識為?spam?的文檔。那些被標識為?starred?或在2014之后的文檔,將比另外那些文檔擁有更高的排名。如果?兩者?都滿足,那么它排名將更高:
{"bool": {"must": { "match": { "title": "how to make millions" }},"must_not": { "match": { "tag": "spam" }},"should": [{ "match": { "tag": "starred" }},{ "range": { "date": { "gte": "2014-01-01" }}}]} }拷貝為 cURL在 Sense 中查看?
如果沒有?must?語句,那么至少需要能夠匹配其中的一條?should?語句。但,如果存在至少一條?must?語句,則對?should?語句的匹配沒有要求。
增加帶過濾器(filtering)的查詢
如果我們不想因為文檔的時間而影響得分,可以用?filter?語句來重寫前面的例子:
{"bool": {"must": { "match": { "title": "how to make millions" }},"must_not": { "match": { "tag": "spam" }},"should": [{ "match": { "tag": "starred" }}],"filter": {"range": { "date": { "gte": "2014-01-01" }} }} }拷貝為 cURL在 Sense 中查看?
| ? | range 查詢已經從?should?語句中移到?filter?語句 |
通過將 range 查詢移到?filter?語句中,我們將它轉成不評分的查詢,將不再影響文檔的相關性排名。由于它現在是一個不評分的查詢,可以使用各種對 filter 查詢有效的優化手段來提升性能。
所有查詢都可以借鑒這種方式。將查詢移到?bool?查詢的?filter?語句中,這樣它就自動的轉成一個不評分的 filter 了。
如果你需要通過多個不同的標準來過濾你的文檔,bool?查詢本身也可以被用做不評分的查詢。簡單地將它放置到?filter?語句中并在內部構建布爾邏輯:
{"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" }}]}}} }拷貝為 cURL在 Sense 中查看?
| ? | 將?bool?查詢包裹在?filter?語句中,我們可以在過濾標準中增加布爾邏輯 |
通過混合布爾查詢,我們可以在我們的查詢請求中靈活地編寫 scoring 和 filtering 查詢邏輯。
constant_score 查詢
盡管沒有?bool?查詢使用這么頻繁,constant_score?查詢也是你工具箱里有用的查詢工具。它將一個不變的常量評分應用于所有匹配的文檔。它被經常用于你只需要執行一個 filter 而沒有其它查詢(例如,評分查詢)的情況下。
可以使用它來取代只有 filter 語句的?bool?查詢。在性能上是完全相同的,但對于提高查詢簡潔性和清晰度有很大幫助。
{"constant_score": {"filter": {"term": { "category": "ebooks" } }} }拷貝為 cURL在 Sense 中查看?
| ? | term?查詢被放置在?constant_score?中,轉成不評分的 filter。這種方式可以用來取代只有 filter 語句的?bool?查詢。 |
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的es dsl多条件组合查询(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 射击游戏单机电脑版(射击游戏单机版大全)
- 下一篇: 转:Java并发编程与高并发解决方案(一