[英]What is the best approach to getting data into S3 for Elasticsearch and RabbitMQ?
[英]What is the best approach for Elasticsearch pagination?
使用 Elasticsearch 进行分页的最佳方法是什么? 目前,我正在开发一个使用 Python 在后端使用 Elasticsearch 的 API,并且我的索引没有太多数据,所以默认情况下我们使用 JavaScript 在前端进行分页(到目前为止,我们还没有任何问题)。
我想知道更大的索引,处理分页的最佳方法是什么:
在 Elasticsearch 中对搜索结果进行分页的默认方式是使用from
/ size
参数。 但是,这仅适用于前 10k 搜索结果。
如果您需要超越该方法,则可以使用search_after
。
如果您需要转储整个索引,并且它包含超过 10k 的文档,请使用scroll
API 。
所有这些查询都允许检索部分搜索结果,但它们有很大的不同。
from/size 是最便宜和最快的,如果 Google 使用 Elasticsearch,它将用于搜索第二、第三等搜索结果页面。
滚动 API 很昂贵,因为它会在您创建第一个查询的那一刻创建一种索引快照,以确保在滚动结束时您将拥有一开始就存在于索引中的数据。 执行滚动请求会消耗资源,并且并行运行其中许多会降低您的性能,因此请谨慎行事。
而是在两者之间进行搜索:
search_after
不是自由跳转到随机页面的解决方案,而是并行滚动许多查询。 它与scroll
API 非常相似,但不同的是,search_after
参数是无状态的,它总是针对最新版本的搜索器进行解析。 因此,排序顺序可能会在遍历期间根据索引的更新和删除而改变。
因此,它将允许您在 10k 以上进行分页,但代价是可能存在一些不一致。
index.max_result_window
设置为 10k 作为硬限制以避免内存不足的情况:
index.max_result_window
搜索到此索引的
from
+size
的最大值。 默认为 10000。搜索请求占用堆内存和时间与from
+size
成正比,这限制了该内存。
切片滚动只是进行普通滚动的一种更快的方式:它允许并行下载文档集合。 切片只是滚动查询输出中文档的一个子集。
Search after 是针对大型结果集的推荐方法。
大体思路是按照特定的列对结果进行排序,最多取10K条记录,然后取最后一条记录的列值,下次取列>“最后一个值”。
您可以将其包装在您自己的 python 函数中,并使整个分页对应用程序透明。
请参阅这篇文章中的示例: https : //runkiss.blogspot.com/2021/11/create-graph-in-pdf-from-elasticsearch.html
response_array = []
response = ElkConfigClient.search index: "index_name",
body: {
query: {
bool: {
must: [
"search_query"
]
}
}
},
scroll: '1h',
size: 1000
scroll_id = response["_scroll_id"]
s_id = scroll_id
#iterate the response
response["hits"]["hits"].each do |response|
response_array.push(response)
end
while (true)
next_response = ElkConfigClient.scroll(scroll_id: s_id, scroll: '1h')
next_scroll_id = next_response["_scroll_id"]
s_id = next_scroll_id
break if next_response["hits"]["hits"].length == 0
next_response["hits"]["hits"].each do |response|
response_array.push(response)
end
response_array
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.