Это хороший вопрос, и короткий ответ таков:
Не только данные, хранящиеся в памяти, делают поиск Elasticsearch таким быстрым
Инвертированные индексы не гарантируютсявсегда храниться в памяти.Мне не удалось найти прямое доказательство, поэтому я сделал вывод из следующего:
Это означает, что Elasticsearch также хранит индексные данные на диске довольно умным способом, поэтому сама файловая система помогает ему с часто доступными поисками.
Одним из таких "лайфхаков" является то, чтодля каждого поля в сопоставлении будет свой инвертированный индекс, который будет достаточно мал, чтобы эффективно кэшироваться с помощью FS, если он часто запрашивается (а поля, которые вы никогда не запрашиваете, просто занимают место на диске).
ИтакElasticsearch хранит оригинальные JSON-файлы в памяти?
Нет, он хранит их в специальном поле с именем _source
.Получить его не быстро, поэтому сценариев доступ к _source
может быть медленным в исполнении.
Существуют ли другие структуры данных, которые делают Elasticsearch быстрым?
Данапример, те, которые используются для агрегирования:
doc_values
, которые ориентированы на столбцы для полей с точными значениями (эта функция делает Elasticsearch немного Столбец БД ), но, опять же, он изначально не находится в памяти и «кэшируется» при частом использовании; fielddata
, который выполняет аналогичную работу, нодля text
полей;на самом деле он хранится в памяти, но он неэффективен и по умолчанию отключен.
Что еще делает Elasticsearch для ускорения поиска?
Он использует больше кэширования: Кэширование запросов Shard и Кеш запросов узлов .Как видите, это не так просто, как «просто поместить данные в память».
Надеюсь, это поможет!