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的主要内容,如果未能解决你的问题,请参考以下文章