Elasticsearch报错Result window is too large(query_phase_execution_exception)解决方案

x33g5p2x  于2021-10-26 转载在 ElasticSearch  
字(1.0k)|赞(0)|评价(0)|浏览(173)

windows安装Elasticsearch参考:
https://blog.csdn.net/MadLifeBin/article/details/120948598

问题

分页查询Elasticsearch,当请求的数据大于 10000 时,继续查询会报错

原因

Elasticsearch 不提倡使用 from + size 的方式请求深度分页,参考官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html

对于深度页面或大型结果集,这些操作会显著增加内存和CPU使用率,从而导致性能下降或节点故障。

同时我们看到有个WARNING,大致意思为:Elasticsearch使用Lucene的内部文档ID作为平局破坏者。这些内部文档ID可以在同一数据的多个副本之间完全不同。当分页搜索命中时,您可能偶尔会看到具有相同排序值的文档排序不一致。也就是在分页时偶尔会遇到文档重复或丢失的情况,不会像 MySQL一样严谨的分页。
这里需要回到 Elasticsearch 的底层原理,You Know, for Search。Elasticsearch在大部分场景下只需要关注第一页最匹配、得分最高的数据,只关注与 搜索,而针对大数据为了加强性能与搜索速度,会对数据进行分片,所以在分页时会有数据逻辑上乱序的情况。

解决方案

一.暴力法——设置 index.max_result_window

{ "index" : { "max_result_window" : 500000}}

二. Scroll

https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html/#scroll-search-results

三. Search After

https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html/#search-after

推荐使用 Search After

方式一不推荐,会牺牲性能和冒着节点故障的风险。
方式二可能在较早版本中使用,具体需要查询官网对应的版本文档。
在最新版本的 Elasticsearch 中,推荐使用 Search After

相关文章