複合查詢是指包含字段類查詢或者複合查詢的類型javascript
constant_score
將查詢內部的結果文檔得分都設定爲1或者boost的值,多用於結合bool查詢實現自定義得分html
GET blog/paper/_search { "query": { "constant_score": { "filter": { "term": { "uID": "1" } } } } }
bool
布爾查詢有一個或者多個布爾子句組成java
語法數組 |
說明 |
filter | 只過濾符合條件的文檔,不計算相關係得分 |
must | 文檔必須符合must中全部的條件,會影響相關性得分 |
must_not | 文檔必須不符合must_not 中的全部條件 |
should | 文檔能夠符合should中的條件,會影響相關性得分緩存 |
語法語句elasticsearch
{ "query":{ "bool":{ "must":[ {} ], "must_not":[ {} ], "should":[ {} ], "filter":[ {} ], } } }
filter
filter查詢只過濾符合條件的文檔,es針對filter會有智能緩存,所以其執行效率很高,作簡單的匹配查詢且不考慮算分是,推薦使用filter替代queryoop
上下文類型 | 執行類型 | 使用方式 |
Query | 查找和查詢語句最匹配的文檔,對全部文檔進行相關性算分排序 | query查詢 bool中的must和should |
Filter | 查找和查詢語句匹配的文檔 | bool中的filter和must_not或者constant_score中的filter |
should
- bool查詢包含should,不包含must查詢,只包含should,文檔必須知足至少一個條件,minimum_should_match能夠知足條件的個數或者百分比。
- bool查詢同時包含should和must查詢,文檔沒必要知足should中的條件,可是若是知足條件,會增長相關性得分。
dis_max query
function_score query
boosting query
filter執行原理深度剖析
1.在倒排索引中查找搜索串,獲取document list。ui
2.爲每一個在倒排索引中搜索到的結果,構建一個bitset,[0, 0, 0, 1, 0, 1]spa
3.遍歷每一個過濾條件對應的bitset,優先從最稀疏的開始搜索,查找知足全部條件的document.net
4.caching bitset,跟蹤query,在最近256個query中超過必定次數的過濾條件,緩存其bitset。對於小segment(<1000,或<3%),不緩存bitset。
5.filter大部分狀況下來講,在query以前執行,先儘可能過濾掉儘量多的數據
6.若是document有新增或修改,那麼cached bitset會被自動更新
7.之後只要是有相同的filter條件的,會直接來使用這個過濾條件對應的cached bitset
布爾查詢是一種最經常使用的組合查詢方式,布爾查詢把多個子查詢組合(combine)成一個布爾表達式,全部子查詢之間的邏輯關係是與(and);只有當一個文檔知足布爾查詢中的全部子查詢條件時,ElasticSearch引擎才認爲該文檔知足查詢條件。布爾查詢支持的子查詢類型共有四種,分別是:must,should,must_not和filter:
查詢字句 | 說明 | 類型 |
must | 文檔必須匹配must查詢條件 | 數組 |
should | 文檔應該匹配should子句查詢的一個或多個 | 數組 |
must_not | 文檔不能匹配該查詢條件 | 數組 |
filter | 過濾器,文檔必須匹配該過濾條件,跟must子句的惟一區別是,filter不影響查詢的score | 字典 |
搜索java,elasticsearch,hadoop,spark關鍵字須要至少匹配2個
本文同步分享在 博客「羊羽」(other)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。