ElasticSearch“match_all”慢,“from”> 1M,文档 +10M

Posted

技术标签:

【中文标题】ElasticSearch“match_all”慢,“from”> 1M,文档 +10M【英文标题】:ElasticSearch "match_all" slow with "from" > 1M with +10M documents 【发布时间】:2014-08-05 23:25:37 【问题描述】:

我有一个简单的单字段索引,其映射如下:

"search": 
  "type": "string",
  "index": "not_analyzed",
  "store": true

它存储在 5 个分片中,有超过 1000 万个文档(每个大约 25 字节),我有一个网页通过以下查询遍历它们:

GET /searches/_search

    "query": 
        "match_all": 
    ,
    "from": 1000000,
    "size":100

以下是一些不合理减速的近似数据(左侧为“从”,右侧为时间以秒为单位):

        0 -> 0.065
    1.000 -> 0.065
   10.000 -> 0.093
  100.000 -> 0.560 
1.000.000 -> 5.200

是否有任何可能的解决方案来获得恒定的执行时间?一些神奇的查询或设置或其他东西。我在同一台机器上还有 3 个索引(全部包含数百万个文档),我不想维护另一个数据库只是为了通过这些数据正确分页。如果我应该迁移,.. 哪个数据库适合这项工作?

谢谢。

编辑: 当我说“迭代”时,我的意思是“分页”。用户可以请求第 10 页并突然请求第 1M 页。我的母语不是英语,如有错误请见谅。

【问题讨论】:

你能解释一下这个查询的用例吗?从 match_all 返回的顺序是任意的,因为它将所有返回的文档的分数设置为 1。那么从doc 1000000开始的目的是什么? 它用于显示在网站上进行的所有搜索的历史记录,我们希望它们看起来分页良好,以便谷歌索引此类搜索的链接。虽然文档具有相同的分数,但 tell 的排序顺序与它们被索引的顺序相同。 【参考方案1】:

这是来自 Elasticseach 页面的文本。

使用 from 和 size 进行深度分页 — 例如?size=10&from=10000 — 是 非常低效,因为(在这个例子中)100,000 个排序结果必须 从每个分片中检索并重新使用,以便仅返回 10 结果。必须为每个请求的页面重复此过程。

->Elasticsearch Page

对于大型数据集,您必须使用滚动。这是link.

【讨论】:

谢谢,我不知道“深度分页”这个词,现在我知道要找什么了。但是在我的情况下滚动不起作用,因为用户可以在不遵循任何顺序的情况下任意请求页面(我已经编辑以澄清这一点)。看来我得用另一个数据库了……

以上是关于ElasticSearch“match_all”慢,“from”> 1M,文档 +10M的主要内容,如果未能解决你的问题,请参考以下文章

016-elasticsearch-Query DSL-查询上下文,过滤上下文match_all

ElasticSearch学习

Elasticsearch按请求体基本查询

elasticsearch 查询 term和match

ElasticSearch常用语句

ElasticSearch 删除所有数据