分页在 elasticsearch 中是如何工作的

How pagination works in elasticsearch

如果我没有指定任何“排序”字段,您能告诉我分页是如何工作的吗?

在我的查询中,如果我没有指定“sort”字段然后尝试使用“from”加“size”进行分页,elasticsearch return 数据如何?是否有可能 return 重复记录?

es 查询:

GET index1, index2/_search?pretty
{
  "from": 10,
  "size": 20,
  "_source": {"includes”:[“name”, “type”]}, 
   "query":{
      "bool":{
         "must":[
            {
               "term":{
                  "org_id":{
                     "value”:”1234456767257”,
                     "boost":1.0
                  }
               }
            },
            {
        "range" : {
          “Timestamp” : {
            "from" : 1596545417000,
            "to" : 1597035223465,
            "include_lower" : true,
            "include_upper" : true,
            "boost" : 1.0
          }
        }
      }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   }
}

在上面的查询中,我没有指定任何“排序”字段。如果我在每次调用后增加“from”,这是否会确保 returning 独特的结果?如果是,怎么做?

默认情况下,来自不同分片的排序结果由接受客户端请求的协调节点完成。

此外,默认情况下,排序是在 _score 字段上完成的。

是的,没有排序字段,考虑到集群稳定且副本与主分片对齐,结果始终是唯一的。

默认情况下,文档按 _score:desc 排序,如果您经常索引新文档,这可能不是您想要的。

我肯定会添加 sort clause on _doc,这是保证您获得独特结果的唯一方法。

{
  "from": 10,
  "size": 20,
  "sort": [
    {
      "_score": "desc"     <--- add this
    },
    {
      "_doc": "asc"        <--- and this
    }
  ],
  ...
}

此外,如果您考虑分页 from: 10000,则需要 leverage search_after