【问题标题】:ElasticSearch Index Sorting and Time-series indexesElasticSearch 索引排序和时间序列索引
【发布时间】:2022-02-03 05:53:03
【问题描述】:

我有一个系统,其中 EESS 有两个索引(简化)。

  • transactions_2022
  • transactions_2021

我根据“transactionDate”决定年份,我的查询是“给我 500 个满足按 transactionDate desc 排序的过滤器的交易”

我想使用https://www.elastic.co/guide/en/elasticsearch/reference/8.0/index-modules-index-sorting.html按事务日期按时间排序搜索它们

POST /transactions_2022,transactions_2021/_search{
 "from" : 0, "size" : 500,
 "query": ...,
  "sort": {
    "transactionDate": {
      "order": "desc"
    }
  }
}

问题是(我之所以问是因为我正在设计一个新系统并试图证明版本升级的合理性,无法轻松测试),如果我在两个索引中启用索引排序并请求 500 个事务, EESS 是否会足够聪明地返回避免对所有与过滤器匹配的文档进行全扫描而只返回 500 个第一笔交易? (或每个索引中的 500 个,然后在后处理阶段丢弃其他 500 个)。

此外,如果我按索引名称排序...,是否会序列化查询?或者它们将并行执行,然后如果不需要则丢弃一个

坦克!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    Elasticsearch 通常以 map-reduce 方式运行操作,分布在分片上,并将数据存储在非常高效的索引中,因此即使没有index sorting,它也不会扫描每个文档;相反,它将从每个分片中收集 500 个顶级文档,然后将它们合并(并丢弃“尾部”)。

    索引排序的作用是控制文档在磁盘上的存储方式,因此当需要检索文档时,顺序读取会更有效率。

    您也可以使用"track_total_hits": false,它会告诉 ES 在分片找到这些前 500 个文档后立即返回并且不要接触其他文档。默认情况下,ES 仍然会计算结果的其余部分以返回匹配文档总数。但是,如果您的客户依赖该数据进行分页,那么这显然是行不通的。

    【讨论】:

    • 谢谢!,明白了。我问是因为在我当前的版本(1.8)中排序非常慢(按单个字段对查询进行排序会将响应时间从 1 秒增加到 5 秒)。所以我猜在我的旧版本中,排序有点迫使 ES 以一种低效的方式查询一些数据(我什至尝试过按存储字段排序)。但是从你的第一段我想这回答了我的问题,不要认为 ElasticSearch 会关心分片是否在一个索引中。
    • 是的 1.8 太旧了
    猜你喜欢
    • 2020-01-26
    • 2014-09-17
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-03-27
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多