1. 程式人生 > >ES系列之ES的查詢排序

ES系列之ES的查詢排序

**

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,結果順序也可能不一樣