ES系列之ES的查詢排序
阿新 • • 發佈:2019-01-06
**
ES的查詢排序問題
**
一.如果是filter查詢(未指定排序條件)
1.從每個shard裡查詢指定條件的記錄(score都預設為0,然後按照doc_id遞增)
2.彙總每個shard返回的記錄,合併排序
首先比較每個shard的第一條記錄的score(高者優先),如果score相同則比較shard_id(低者優先),shard_id相同則比較shard裡的hit_index(低者優先),遞迴
二.如果是普通score查詢(未指定排序條件)
1.從每個shard裡查詢指定條件的記錄(score從高到低,相同score按照doc_id遞增)
2.首先比較每個shard的第一條記錄的score(高者優先),如果score相同則比較shard_id(低者優先),shard_id相同則比較shard裡的hit_index(低者優先),遞迴
三.如果是普通查詢(指定排序條件)
1.從每個shard裡查詢指定條件的記錄(按指定sort field排序,相同filed值按照doc_id遞增)
2.首先比較每個shard的第一條記錄的sort field(高者優先),如果filed值相同則比較shard_id(低者優先),shard_id相同則比較shard裡的hit_index(低者優先),遞迴
相同查詢條件有時返回結果不一樣的原因:
1.shard的主和副本里面doc_id會不一樣(shard獨立),查詢有時查副本有時查主shard
2.shard裡面定期segment會合並(特別是有實時資料入庫時),導致裡面的doc_id會重新賦值,所以即使都查詢主shard,結果順序也可能不一樣