Использование API прокрутки через elasticsearch-model

На всю жизнь я не могу найти никаких ссылок на использование API-интерфейса прокрутки ElasticSearch из Ruby on Rails и драгоценного камня модели elastisearch (или рельсов или dsl).

Единственное, на что они ссылаются в документах, — это вызов прокрутки непосредственно на клиенте, что противоречит цели. Кроме того, он не использует клиент или какие-либо настройки клиента, которые вы уже установили в своем приложении Rails.

Я хочу сделать что-то вроде этого.

Вот запрос ElasticSearch, который работает из Kibana Dev Tools:

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' }

Есть ли у кого-нибудь более удобные примеры?


person phil    schedule 27.05.2019    source источник
comment
вы смогли найти решение этой проблемы?   -  person Sivan    schedule 29.07.2020
comment
Нет. В основном я делаю последний блок кода в своем примере.   -  person phil    schedule 30.07.2020


Ответы (1)


Согласно руководству по поиску эластичности -

Мы больше не рекомендуем использовать API прокрутки для глубокой разбивки на страницы. Если вам нужно сохранить состояние индекса при просмотре более 10 000 обращений, используйте параметр search_after с моментом времени (PIT).

Ссылка – 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
person Sandip Karanjekar    schedule 03.12.2020