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