在我生命中,我找不到在Ruby on Rails和elastisearch-model(或rails或dsl)gem中使用ElasticSearch滚动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' }
还有没有其他人性化的示例?
答案 0 :(得分:0)
根据Elasticsearch指南-
我们不再建议使用scroll API进行深度分页。如果在翻阅10,000多个匹配时需要保留索引状态,请使用带有时间点(PIT)的search_after参数。
参考- https://www.elastic.co/guide/en/elasticsearch/reference/7.x/scroll-api.html
进一步编辑以上问题- 要在文档上滚动,需要使用result的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