Статьи

Как Elasticsearch в режиме реального времени поиска?

По сравнению с другими функциями,   возможность поиска в реальном времени , несомненно, является одной из самых важных функций в Elasticsearch. Сегодня мы рассмотрим внимательно, как обеспечивается поиск в реальном времени Elasticsearch.

В реальном времени

Прежде всего, если нам нужно объяснить концепцию реального времени, в целом, мы можем сказать, что задержка между входным и выходным временем в информации мала в системах реального времени. Это означает, что данные берутся без накопления данных, обрабатываются в режиме реального времени.

На сегодняшний день лучшее решение Elasticsearch, известное для поиска в реальном времени, когда запись добавляется в нее для хранения, делает ее доступной для поиска за 1 секунду.

Как?

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

На этом этапе Elasticsearch использует  кэш файловой системы,  который находится между собой и диском, чтобы преодолеть риск узких мест и обеспечить возможность поиска нового документа в режиме реального времени.

Новый  сегмент  сначала записывается в кэш файловой системы, и только потом он записывается на диск Elasticsearch. Этот легкий процесс написания и открытия нового сегмента в Elasticsearch называется обновлением. По умолчанию все осколки обновляются автоматически раз в секунду. Таким образом, Elasticsearch поддерживает поиск в реальном времени.

Время теста

Над отступлением от времени обновления осколков можно вспомнить следующие вопросы:

  1. Что происходит, когда новый документ запрашивается менее чем за 1 секунду?
  2. Можно ли запрашивать документы, не прибегая к зависимости от фрагментов периода обновления, которыми управляет Elasticsearch?

Короткие ответы.

  1. Elasticsearch не возвращает документ.
  2. Да.

Теперь давайте проясним этот вопрос — простой пример.

hakdogan$ curl -XPUT localhost:9200/kodcucom/document/1 -d'{
> "title": "Document A"
> }'

Мы отправили документ в Elasticsearch. Имя индекса — kodcucom, тип документа, значение идентификатора 1. Поле заголовка — это только поле в документе и значение « Документ А ». Давайте возьмем этот документ от Elasticsearch.

hakdogan$ curl -XGET localhost:9200/kodcucom/document/1?pretty
{
  "_index" : "kodcucom",
  "_type" : "document",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source":{
"title": "Document A"
}
}

Как и ожидалось, документ был возвращен нам. Что ж, если мы сократим время между записью документа и получением запроса, чем время обновления шарда по умолчанию, что произойдет?

Давайте посмотрим.

hakdogan$ curl -XPUT localhost:9200/kodcucom/document/2 -d'{"title": "Document B"}'; curl -XGET localhost:9200/kodcucom/_search?pretty
{"_index":"kodcucom","_type":"document","_id":"2","_version":1,"created":true}{
  "took" : 38,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "kodcucom",
      "_type" : "document",
      "_id" : "1",
      "_score" : 1.0,
      "_source":{
"title": "Document A"
}
    } ]
  }
}

Как видно, Elasticsearch вернул нам только предыдущий документ, когда мы одновременно создаем и получаем запрос. Ну, как я могу получить документ одновременно?

Давайте посмотрим.

hakdogan$ curl -XPUT localhost:9200/kodcucom/document/3 -d'{"title": "Document C"}'; curl -XGET localhost:9200/kodcucom/_refresh; curl -XGET localhost:9200/kodcucom/_search?pretty
{"_index":"kodcucom","_type":"document","_id":"3","_version":1,"created":true}{"_shards":{"total":10,"successful":5,"failed":0}}{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "kodcucom",
      "_type" : "document",
      "_id" : "1",
      "_score" : 1.0,
      "_source":{
"title": "Document A"
}
    }, {
      "_index" : "kodcucom",
      "_type" : "document",
      "_id" : "2",
      "_score" : 1.0,
      "_source":{"title": "Document B"}
    }, {
      "_index" : "kodcucom",
      "_type" : "document",
      "_id" : "3",
      "_score" : 1.0,
      "_source":{"title": "Document C"}
    } ]
  }
}

В этой команде мы выполняем операцию обновления индекса kodcucom перед поисковым запросом. Таким образом, документ был возвращен нам.

Время автоматического обновления можно изменить.

  1. Установив параметр index.refresh_interval в файле конфигурации. Относится ко всем показателям в кластере.
  2. На основе индекса по обновленной настройке индекса.

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

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