По сравнению с другими функциями, возможность поиска в реальном времени , несомненно, является одной из самых важных функций в Elasticsearch. Сегодня мы рассмотрим внимательно, как обеспечивается поиск в реальном времени Elasticsearch.
В реальном времени
Прежде всего, если нам нужно объяснить концепцию реального времени, в целом, мы можем сказать, что задержка между входным и выходным временем в информации мала в системах реального времени. Это означает, что данные берутся без накопления данных, обрабатываются в режиме реального времени.
На сегодняшний день лучшее решение Elasticsearch, известное для поиска в реальном времени, когда запись добавляется в нее для хранения, делает ее доступной для поиска за 1 секунду.
Как?
Как известно, диски могут создавать риск узкого места для операций ввода-вывода на этапе сохранения данных. Также некоторые механизмы, используемые для предотвращения потери данных, увеличивают стоимость времени.
На этом этапе Elasticsearch использует кэш файловой системы, который находится между собой и диском, чтобы преодолеть риск узких мест и обеспечить возможность поиска нового документа в режиме реального времени.
Новый сегмент сначала записывается в кэш файловой системы, и только потом он записывается на диск Elasticsearch. Этот легкий процесс написания и открытия нового сегмента в Elasticsearch называется обновлением. По умолчанию все осколки обновляются автоматически раз в секунду. Таким образом, Elasticsearch поддерживает поиск в реальном времени.
Время теста
Над отступлением от времени обновления осколков можно вспомнить следующие вопросы:
- Что происходит, когда новый документ запрашивается менее чем за 1 секунду?
- Можно ли запрашивать документы, не прибегая к зависимости от фрагментов периода обновления, которыми управляет Elasticsearch?
Короткие ответы.
- Elasticsearch не возвращает документ.
- Да.
Теперь давайте проясним этот вопрос — простой пример.
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 перед поисковым запросом. Таким образом, документ был возвращен нам.
Время автоматического обновления можно изменить.
- Установив параметр index.refresh_interval в файле конфигурации. Относится ко всем показателям в кластере.
- На основе индекса по обновленной настройке индекса.
В дополнение к этому вы можете отключить автоматическое обновление. Важно помнить о времени обновления сегментов, операция обновления является дорогостоящей с точки зрения системных ресурсов. Если вы хотите внести изменения во время автоматического обновления, эта ситуация должна быть принята во внимание.
Продление времени автоматического обновления позволяет быстрее индексировать, но новые документы и изменения, внесенные в существующие документы, не будут отображаться в результатах поиска в течение указанного периода времени.