ElasticSearch中Filter和Query的異同
阿新 • • 發佈:2019-01-01
如下例子,查詢性別是女,所在的州是PA,過濾條件是年齡是39歲,balance大於等於10000的文件:
。另外關於某個搜尋的分值計算還是很複雜的,因此也需要一定的時間。
{ "query": { "bool": { "must": [ { "match": { "gender": "F" } }, { "match": { "state": "PA" } } ], "filter": [ { "term": { "age": "39" } }, {"range": { "balance": { "gte": "10000" } } } ] } } }
返回結果:
查詢雖然包含這兩種,但是查詢在不同的執行環境下,操作還是不一樣的。
Query與Filter
查詢在Query查詢上下文和Filter過濾器上下文中,執行的操作是不一樣的:
Query查詢上下文:
在查詢上下文中,查詢會回答這個問題——“這個文件匹不匹配這個查詢,它的相關度高麼?”
如何驗證匹配很好理解,如何計算相關度呢?之前說過,ES中索引的資料都會儲存一個_score分值,分值越高就代表越匹配
查詢上下文 是在 使用query進行查詢時的執行環境,比如使用search的時候。
Filter過濾器上下文:
在過濾器上下文中,查詢會回答這個問題——“這個文件匹不匹配?”
答案很簡單,是或者不是。它不會去計算任何分值,也不會關心返回的排序問題,因此效率會高一點。
過濾上下文 是在使用filter引數時候的執行環境,比如在bool查詢中使用Must_not或者filter。
另外,經常使用過濾器,ES會自動的快取過濾器的內容,這對於查詢來說,會提高很多效能。
總結
1 查詢上下文中,查詢操作不僅僅會進行查詢,還會計算分值,用於確定相關度;在過濾器上下文中,查詢操作僅判斷是否滿足查詢條件
2 過濾器上下文中,查詢的結果可以被快取。