分页如何在Elasticsearch中工作

问题描述

如果我未指定任何“排序”字段,请告诉我分页是如何工作的?

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

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”,是否可以确保返回唯一结果?如果可以,怎么办?

解决方法

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

默认情况下,排序也是在_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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...