按 _doc 对文档排序时结果不一致

Inconsistent results when sorting documents by _doc

我想使用 sort+search_after 分页机制获取 elasticsearch 命中。

elasticsearch 文档指出:

_doc has no real use-case besides being the most efficient sort order. So if you don’t care about the order in which documents are returned, then you should sort by _doc. This especially helps when scrolling.

但是,当多次执行相同的查询时,我得到不同的结果。更具体地说,第一个命中在两个不同的命中之间随机交替,其中返回的 sort 字段对于一个命中是 0,对于另一个命中是一些特定的数字。

这显然会破坏分页,因为它依赖于 sorting 中返回的值,稍后将被送入 sort_after 以进行下一次查询。

查询时没有数据写入索引,所以这不是因为刷新。

因此我的问题是:

  1. 分页按_doc排序是不是错了?似乎我得到的结果不一致。
  2. 内部如何按 _doc 排序?缺少这方面的文档,因为它只是说明排序是按“索引顺序”执行的。

使用 Spark 将数据并行写入索引。我认为问题可能是并行写入与“索引顺序”排序相结合,但是我没有设法用其他也在 Spark 中写入的索引复制此行为。

es 7,索引包含2个分片,一主一副本

干杯。

发生这种情况的原因是索引由 2 个分片组成。一个主要的和一个副本。文档未按相同顺序编入索引。因此,结果的顺序取决于返回它们的分片。这在使用滚动时很好,因为 Elasticsearch 会保留结果的内部状态,但不会使用无状态的分页。