ruby-on-rails - 通过 elasticsearch-model 使用滚动 api
问题描述
在我的一生中,我找不到在 Ruby on Rails 和 elastisearch-model(或 rails 或 dsl)gem 中使用 ElasticSearch scroll api 的任何参考。
他们在文档中唯一引用的是直接在客户端上调用滚动,这违背了目的。此外,它不使用客户端或您已经在 Rails 应用程序中设置的任何客户端设置。
我想做这样的事情。
这是在 Kibana 开发工具中工作的 ElasticSearch 查询:
GET model_index/_search?scroll=1m
{
"size": 100,
"query": {
"match": {
"tenant_id": 3196
}
},
"_source": "id"
}
我本以为我可以调用类似的东西
MyModel.search scroll: '1m', ...
但似乎我需要这样做:
# First create a client by hand
client = Elasticssearch::Client.new
result = client.search index: 'model_index',
scroll: '1m',
body: { query: { match: { tenant_id: 3196 } }, sort: '_id' }
有没有人有更多用户友好的例子?
解决方案
根据弹性搜索指南 -
我们不再推荐使用滚动 API 进行深度分页。如果您需要在分页超过 10,000 次点击时保留索引状态,请使用带有时间点 (PIT) 的 search_after 参数。
参考 - https://www.elastic.co/guide/en/elasticsearch/reference/7.x/scroll-api.html
进一步编辑上述问题 - 要滚动文档需要使用结果中的 scroll_id,以获得下一组结果。
body = { query: { match: { tenant_id: 3196 } }, sort: '_id' }
response = Elasticsearch::Client.new.search(
index: 'model_index',
scroll: "1m",
body: body,
size: 3000
)
loop do
hits = response.dig('hits', 'hits')
break if hits.empty?
hits.each do |hit|
# do something
end
response = Elasticsearch::Client.new.scroll(
:body => { :scroll_id => response['_scroll_id'] },
:scroll => '1m'
)
end
推荐阅读
- azure-log-analytics - 基于日期查询的 Azure 日志分析
- php - Netsuite PHP Toolkit - 保存的搜索返回所有数据,而不是选定的列
- bash - 如何在 ssh pkill bash 命令中正确转义双引号?
- npm - 使用 Inquirer 时,“List”和“Rawlist”有什么区别
- laravel - Laravel 性能:数据透视表
- tomcat8 - 使用stock http的tomcat8 - 错误读取请求,被忽略
- sap - 如何在 HANA 脚本计算视图中检查多个值的输入参数的值
- javascript - d3.js v5 - 从 SVG 读取元素
- javascript - 在单独的对象中查找匹配值
- .net - 如何在 Azure 部署的应用程序中应用数据库代码优先迁移?