避坑指南,Elasticsearch 分页查询的两个问题,你一定要知道

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 使用 Docker 部署完 RabbitMQ 服务,到 /var/log/rabbitmq 目录下一看,空空如也,并没有日志文件生成。是没有日志吗?并非如此,日志都打在了标准输出上。

Elasticsearch 分页查询有个特点,如果你写一个这样的查询语句:


{
    "from" : 10, "size" : 10,
    "query" : {}
}
复制代码


Elasticsearch 会查询出前 20 条数据,然后截断前 10 条,只返回 10-20 的数据。


这样做带来的副作用很明显,数据量大的话,越到后面查询越慢。


所以针对大数据量的查询,要使用 scroll。这种方式相当于建立了一个游标,标记当前的读取位置,保证下一次查询快速取出数据。


但这两种方式都还有一个小坑需要注意,下面来详细说明。


from + size 方式


可能会出现的问题:


Result window is too large, from + size must be less than or equal to: [10000] but was [10010].  See the scroll api for a more efficient way to request large data sets.  This limit can be set by changing the [index.max_result_window] index level setting.


这个报错信息其实已经说的很明确了,通过这种分页方式查询的最大值是 10000,超过 10000 就会报错。


解决办法也很简单,一是针对大数据量查询采用 scroll 方式;二是增加 index.max_result_window 值的大小,使其支持查询范围。


推荐使用 scroll 方式。


scroll 方式


可能会出现的问题:


Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting.


产生这个错误的原因是:


当有大量需要使用 scroll 的请求向 Elasticsearch 请求数据时,系统默认最大 scroll_id 数量是 500,当达到最大值时,导致部分请求没有 scroll_id 可用,产生报错。


特别是在高并发场景下,这种问题可能会更加常见。


解决办法可以增加 search.max_open_scroll_context 值的大小。


但这么解决并不好,更好的办法是查询完之后,及时清理 scroll_id。


# python
from elasticsearch import Elasticsearch
client = Elasticsearch(host, http_auth=(username, password), timeout=3600)
es_data = client.search(es_index, query_body, scroll='1m', size=100)
scroll_id = es_data['_scroll_id']
client.clear_scroll(scroll_id=scroll_id)  # 清理方法
复制代码


其实,即使我们不手动清理,等过期之后,游标也会自己释放,这跟使用时的参数有关。

比如 scroll='1m' 代表 1min 后会释放。


但就像我们使用其他资源一样,使用完之后及时释放,养成良好的编码习惯,系统才能更健壮。


参考文档:



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
存储 SQL 缓存
【ElasticSearch从入门到放弃系列 十】Elasticsearch深度分页查询方式讨论
【ElasticSearch从入门到放弃系列 十】Elasticsearch深度分页查询方式讨论
151 0
|
机器学习/深度学习 存储 搜索推荐
干货 | 全方位深度解读 Elasticsearch 分页查询
1、关于 Elasticsearch 分页查询,这几个问题经常被问到 问题1:想请问下,一次性获取索引上的某个字段的所有值(100 万左右),除了把 max_result_window 调大 ,还有没有啥方法? 问题2:关于 es 的分页,每次拿 20 条展示在前台,然后点击下一页,在查询后面的20条数据,应该要怎么写? 问题3:From+size、Scroll、search_after 的本质区别和应用场景分别是什么?
1695 0
干货 | 全方位深度解读 Elasticsearch 分页查询
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
|
2月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
2月前
|
Ubuntu Oracle Java
如何在 Ubuntu VPS 上安装 Elasticsearch
如何在 Ubuntu VPS 上安装 Elasticsearch
19 0
|
2月前
|
存储 Ubuntu Oracle
在Ubuntu 14.04上安装和配置Elasticsearch的方法
在Ubuntu 14.04上安装和配置Elasticsearch的方法
30 0
|
2月前
|
存储 安全 Java
在CentOS 7上安装和配置Elasticsearch的方法
在CentOS 7上安装和配置Elasticsearch的方法
95 0
|
2月前
|
自然语言处理 Docker 容器
ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装
ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装
29 0
下一篇
无影云桌面