博客
关于我
es查询-统计总数以及深度分页
阅读量:798 次
发布时间:2023-04-02

本文共 1750 字,大约阅读时间需要 5 分钟。

Elasticsearch 查询优化指南

一、查询总数

在 Elasticsearch 中查询匹配到的文档总数时,可能会遇到以下问题:

  • ES 查询 hits 统计总数不准?

    当我们使用 ES 查询时,匹配到的文档总数可以通过 hits.total.value 获取。然而,ES 默认限制索引查询最多只能返回 10000 条数据。这种限制可能会导致以下问题:

    • 当数据量超过 10000 时,track_total_hits 参数会固定为 10000,导致统计数量不准确。
    • 为解决这一问题,ES 提供了 track_total_hits 参数。
    • 使用场景
      • 如果业务需求中不需要精准计算超过 10000 条的数据总数,可以将 track_total_hits 设为 false 以优化查询效率。
      • 如果需要精准统计,可以将 track_total_hits 设置为 true,此时返回的 hits.total.relation 会显示精确计数。
  • ES 默认限制索引查询最多只能查询 10000 条数据

    • 在查询超过 10000 条数据时,ES 会提示 result window is too large 错误。
    • 解决方案:
      • 在 Kibana 中执行以下命令解除索引最大查询数的限制:
        PUT /_all/_settings{    "index.max_result_window": 200000}
      • 或者在创建索引时添加以下配置:
        {    "settings": {        "index": {            "max_result_window": 5000005        }    }}
  • 二、查询数据

    在查询具体数据时,可能会遇到以下问题:

  • 查询超过 10000 条数据时会报错
    • 解决方案:
      • 解除索引最大查询数的限制(如上述方法)。
  • 三、深度分页

    在实现分页查询时,需要注意以下几点:

    1. 浅分页(from+size)

    • 浅分页的原理是简单地从数据库中取出一定范围的数据,适用于大部分场景。
    • 使用方法
      GET test_alias/_search{    "query": {        "match_all": {}    },    "sort": [        {            "add_time": {                "order": "desc"            }        }    ],    "from": 0,    "size": 10}
    • 优点:实现简单,适合小规模数据。
    • 缺点:当数据量较大时,分页效率较低。

    2. 滚动分页(scroll)

    • 使用场景:适用于需要多次分页查询的场景,例如数据导出。
    • 参数说明
      • scroll:设置滚动上下文的有效时间(例如 scroll=5m)。
      • size:每次查询返回的数据量。
    • 删除滚动上下文
      • 删除指定滚动 ID:
        DELETE _search/scroll/DnF1ZX...
      • 删除所有滚动上下文:
        DELETE _search/scroll/_all
    • 注意事项:滚动分页会消耗较多资源,建议仅在需要实时数据导出时使用。

    3. search_after 深分页(ES 5.0 及以后版本)

    • 使用场景:适用于需要支持实时数据更新的分页查询。
    • 实现原理:通过查询结果中排序字段的值来确定下一页的位置。
    • 注意事项
      • 需要为每个文档分配一个全局唯一标识(如 _uid 或业务唯一 ID)。
      • search_after 查询不支持跳页,必须依赖上一页的最后一条数据。

    4. 前端传入上次查询的最小 ID

    • 实现方式
      • 前端传入上一次查询返回列表中最小的 ID。
      • 在 ES 查询中设置范围查询:
        {    "query": {        "term": {            "id": "minId"        }    },    "sort": {        "id": "asc"    },    "limit": "limit"}
    • 优势:支持跳页查询,适合前端分页场景。

    通过以上方法,可以根据业务需求选择合适的分页方式,同时注意优化硬件资源和查询效率。

    转载地址:http://fmefk.baihongyu.com/

    你可能感兴趣的文章
    P1207 双重回文数
    查看>>
    p1229
    查看>>
    P1273 有线电视网(树形dp)
    查看>>
    spring编程常见错误二 (学习笔记)
    查看>>
    P1364 医院设置
    查看>>
    P1614 爱与愁的心痛
    查看>>
    spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    查看>>
    P1865 A % B Problem
    查看>>
    P1908 逆序对
    查看>>
    P2158 [SDOI2008]仪仗队
    查看>>
    P2161 [SHOI2009]Booking 会场预约
    查看>>
    P2260 [清华集训2012]模积和
    查看>>
    P2x与P3x的区别
    查看>>
    P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
    查看>>
    P3240 [HNOI2015]实验比较 树形DP
    查看>>
    SpringBoot中集成Minio高性能分布式存储文件服务入门
    查看>>
    P3383 素数筛
    查看>>
    P3455 [POI2007]ZAP-Queries
    查看>>