首页 > 解决方案 > 通过 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' }

有没有人有更多用户友好的例子?

标签: ruby-on-railselasticsearchelasticsearch-railselasticsearch-model

解决方案


根据弹性搜索指南 -

我们不再推荐使用滚动 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

推荐阅读