2016-11-03 2 views
0

Я столкнулся с функциями прокрутки в Elastic Search, и это выглядит довольно интересно. Я прошел через так много документов, но все еще ниже вопросов мне непонятно.Elastic Search Scroll Behavior

  1. Если смещение уже существует, то зачем использовать свиток?
  2. Что относительно предстоящих записей? Предположим, что он закончил прокрутку всех данных, а затем через несколько секунд в индекс вошли новые данные, и как это будет работать? будет ли он прокручиваться, чтобы получить новые записи, например, потоковое вещание?
  3. Предположим, что соединение повреждено из-за загрузки сервера или интернет-проблемы, и начнет ли он прокручивать данные с начала?

Все эти вопросы находятся в контексте переиндексации данных из старого индекса в новый.

ответ

2

Я попытаюсь дать некоторую информацию об этом, как я тоже недавно сделал некоторые исследования в том, что:

Если смещение уже есть, то почему бы использовать прокрутку?

Я не уверен, что вы можете использовать свиток в сочетании с смещениями. Но я считаю, что основное отличие заключается в том, что запрос смещения даст вам «ложные» результаты. False с точки зрения этого выполнит ваш запрос правильно, однако рассмотрите все обновления между ними. Что касается переиндексации, это было бы неправильно, поскольку вы рискуете потерять данные. Представьте, что вы выполняете смещенный запрос из результатов 10k, а затем занимаете 2 минуты для его обработки. У вас могут быть обновления для ваших объектов (или вставок) в течение 2 минут. Это означает, что смещение вашего запроса на 10k может привести к тому, что результат пропустит несколько строк между ними или к результату, который уже был там (представьте удаление между ними). Однако прокрутка гарантирует сохранение живого контекста поиска и получение результатов четким и строгим способом, при котором обновления не будут рассмотрены.

Я думаю, что требуемое поведение может быть реализован с постоянной сортировкой + поиск после того, как как описано здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html Это должно сделать стабильные результаты (в свою очередь, от курсора, указывая на смещение является правильным), однако она до сих пор считают все изменения (я думаю), которые происходят между двумя запросами.

Я бы предположил, что переиндексация произойдет, изменив конфигурацию (скажем, logstash), чтобы начать вставлять правильные документы в новый индекс, а затем прокручивать ВСЕ старые данные, чтобы переиндексировать их в новый индекс. Используя прокрутку, вы сможете по-прежнему работать с этими старыми данными, в то время как изменения не повлияют на вашу операцию reindex.

Docs:

Хотя запрос поиска возвращает одну «страницу» результатов, свитка API может быть использована для получения большого количества результатов (или даже всех результатов) от одного запроса поиска, почти так же, как вы, , будет использовать курсор в традиционной базе данных.

Далее:

Что о предстоящих записи? Предположим, что он закончил прокручивать все данные , а затем через несколько секунд в индекс вошли новые данные, тогда как это будет ? будет ли он прокручиваться, чтобы получить новые записи, например, потоковое вещание?

Прокрутка сохранит результат, который он создал по первому запросу прокрутки. Это делается путем создания моментального снимка и предотвращения публикации изменений в конкретном прокрутке. Docs:

Результаты, возвращаемые из запроса прокрутки отражают состояние индекса в момент первоначального запроса на поиск был сделан, как моментальный снимок. Последующие изменения в документах (индекс, обновление или удаление) повлияют только на последующие поисковые запросы.

И третье:

Пусть соединение разорвано из-за нагрузки на сервер или проблемы Интернет, то он будет начать прокрутку данных от начала?

Это не имеет значения. Свиток поставляется с настройкой, например. POST /twitter/tweet/_search?scroll=1m, где присвоение, 1m, указывает на поиск elasticsearch, как долго сохраняется контекст поиска с ES-сервером. Это означает, что если ваше соединение ломается, все, что вам нужно сделать, это забрать свой идентификатор прокрутки и использовать его для создания нового запроса. ES сопоставляет этот идентификатор с существующим контекстом поиска и дает ожидаемые результаты. Docs:

Для того, чтобы использовать скроллинг запрос первоначального поиска должен указать параметр прокрутки в строке запроса, который говорит Elasticsearch , как долго он должен держать «поиск контекста» живой (см Сохраняя поиск контекст живой), например? scroll = 1m.

В общем, все, что информация может быть найдена здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

Надеется, что это помогает,

Артур