qq_61294100 2023-03-04 19:04 采纳率: 81.8%
浏览 13
已结题

elasticsearch from和size分页查询得不到想要的结果

问题描述:elasticsearch from和size分页查询得不到想要的结果

代码:

#分页
#from就相当于MySQL中limit后面的第一个参数
#from就相当于MySQL中limit后面的第二个参数
GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "from": 1,
  "size": 2
}

出错结果:

#①当 from为0时
{
  "took" : 14,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : 1,
          "title" : "华为笔记本电脑",
          "category" : "华为",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 5388
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "id" : 2,
          "title" : "华为手机",
          "category" : "华为",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 5500
        }
      }
    ]
  }
}
②当from为1时
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "id" : 2,
          "title" : "华为手机",
          "category" : "华为",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 5500
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "id" : 3,
          "title" : "VIVO手机",
          "category" : "vivo",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3600
        }
      }
    ]
  }
}

问题描述: 当显示每页显示数量为2时,让from=0,再让from=1,数据出现了重叠

  • 写回答

3条回答 默认 最新

  • 「已注销」 2023-03-05 00:06
    关注

    “Devil组”引证GPT后的撰写:

    • 这是因为 Elasticsearch 的分页机制是基于分片(shard)的,每个分片都会返回一部分结果。因此,当你设置 from 和 size 参数时,Elasticsearch 实际上会查询整个索引的数据,并将查询结果分为大小相等的分片。然后,它会根据 from 参数的值来确定要从哪个分片开始返回结果,并返回 size 参数指定的结果数量。
    • 在你的查询中,你设置了 size 参数为 2,当 from 参数为 0 时,Elasticsearch 会从第一个分片开始返回前两条结果(即文档 id 为 1 和 2)。当 from 参数为 1 时,它会从第二个分片开始返回结果,这些结果包括文档 id 为 2 和 3,因此出现了重叠的结果。
    • 为了解决这个问题,你可以使用 search_after 参数而不是 from 参数来执行分页查询。search_after 参数是一个排序值,用于指示 Elasticsearch 从哪里开始返回结果。你可以将上一页最后一条文档的排序值作为 search_after 参数的值,以便从上一页的下一条文档开始返回结果。这将确保不会出现重叠的结果。

    例如,下面是一个使用 search_after 参数的查询示例:

    GET /my_index/_search
    {
      "query": {
        "match_all": {}
      },
      "size": 2,
      "sort": [
        {"_id": "asc"}
      ],
      "search_after": [2]
    }
    
    
    

    用 _id 字段进行排序,并将文档 id 为 2 作为 search_after 参数的值。这将从文档 id 为 3 开始返回两个文档。每个新的分页查询都使用前一页的最后一个文档的排序值作为 search_after 参数的值,以确保不会出现重叠的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 LD衰减图用R语言对其可视化
  • ¥15 Mermaid语法生成的svg在Axure无法编辑
  • ¥15 Windchill二次开发
  • ¥15 怎么把tkinter和其他代码结合起来使功能可以完善
  • ¥15 爬取豆瓣电影相关处理
  • ¥15 手机淘宝抓清除消息接口
  • ¥15 C#无selenium
  • ¥15 用机器学习方法帮助保险公司预测哪些是欺诈行为
  • ¥15 数据爬取,python
  • ¥15 怎么看 cst中一个面的功率分布图,请说明详细步骤。类似下图