通过elasticsearch-model使用滚动API

时间:2019-05-27 06:35:11

标签: ruby-on-rails elasticsearch elasticsearch-rails elasticsearch-model

在我生命中,我找不到在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' }

还有没有其他人性化的示例?

1 个答案:

答案 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