Elasticsearch 2.1:结果窗口太大(index.max_result_window)

Ron*_*ald 81 elasticsearch

我们从Elasticsearch 2.1检索信息,并允许用户通过结果进行分页.当用户请求高页码时,我们收到以下错误消息:

结果窗口太大,+大小必须小于或等于:[10000]但是[10020].有关请求大型数据集的更有效方法,请参阅scroll api.可以通过更改[index.max_result_window]索引级别参数来设置此限制

弹性文档说这是因为高内存消耗和使用滚动API:

高于的值会占用每次搜索和执行搜索的每个分片的大量堆内存.保留此值是最安全的,因为它是使用滚动API进行任何深度滚动https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits

问题是我不想检索大型数据集.我只想从结果集中非常高的数据集中检索切片.滚动文档也说:

滚动不适用于实时用户请求https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html

这给我留下了一些问题:

1)如果我使用滚动api向上滚动到结果10020(并忽略10000以下的所有内容)而不是对结果10000-10020进行"正常"搜索请求,那么内存消耗是否真的会降低(如果是这样的话)

2)似乎滚动API对我来说不是一个选项,但我必须增加"index.max_result_window".有人对这个有经验么?

3)还有其他选择来解决我的问题吗?

小智 73

如果你需要大的深度分页,我认为只有一种解决方案是增加值max_result_window

curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }'
Run Code Online (Sandbox Code Playgroud)

内存使用量的增加,我找不到~100k的值

  • 对于那些使用此命令为较新版本的 elasticsearch 获取标头错误的人,您还需要传递标头, curl -XPUT "http://localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d '{"index":{"max_result_window":50000}}' (3认同)
  • 对于小于500000的少量文档,这是一个很好的解决方案 (2认同)
  • 我正在使用ES v2.2.0并且我必须将有效负载更改为"{"max_result_window":500000}`以使其工作.所以curl命令变成了 - `curl -XPUT"http:// localhost:9200/my_index/_settings"-d'{"max_result_window":500000}'` (2认同)

Guy*_*ski 28

正确的解决方案是使用滚动.
但是,如果要将结果search返回超过10,000个结果,可以使用Kibana轻松完成:

转到Dev Tools并将以下内容发布到索引(your_index_name),指定新的最大结果窗口

在此输入图像描述

PUT your_index_name/_settings
{ 
  "max_result_window" : 500000 
}
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,您应该看到以下成功响应:

{
  "acknowledged": true
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试按照在elasticsearch代码(put_settings等)中执行此操作的方式进行操作,并遇到了许多错误。这节省了我几个小时!谢谢你! (2认同)

Ron*_*ald 21

弹性文档中的以下页面讨论了深度分页:

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

根据文档的大小,分片数量以及您使用的硬件,分页10,000到50,000个结果(1,000到5,000页)深度应该是完全可行的.但是,如果使用大量的值,那么使用大量的CPU,内存和带宽,排序过程确实会变得非常沉重.出于这个原因,我们强烈建议不要进行深度分页.

  • 我们可以在需要深度分页的情况下使用滚动API吗? (2认同)
  • 但是当我们启用排序功能时,请在电子商务网站上说.当用户想要查看价格最高的商品时.当我们按最高价格排序比较我们按最低页面排序但是到最后一页右边时,结果会有所不同吗?因为我们限制了可以访问的结果数量.为此做的任何工作? (2认同)