Понимание инвертированного индекса в Elasticsearch

Если вы читали, как работают анализаторы в Elasticsearch до прочтения этой статьи, то вы знаете, как Elasticsearch анализирует текстовые поля. Тогда вы можете задаться вопросом, что же на самом деле происходит с результатами процесса анализа. Они должны где-то храниться, ведь иначе в чем смысл? Результаты анализа действительно где-то хранятся; они находятся внутри того, что называется инвертированным индексом. Это звучит очень причудливо и абстрактно, но как только я покажу вам простую иллюстрацию, вы увидите, что на самом деле все не так уж сложно.

Elasticsearch

Цель инвертированного индекса - хранить текст в структуре, которая позволяет осуществлять очень эффективный и быстрый полнотекстовый поиск. При выполнении полнотекстового поиска мы фактически запрашиваем инвертированный индекс, а не документы JSON, которые мы определили при индексировании документов. Причина, по которой я говорю "инвертированный индекс", заключается в том, что кластер будет иметь по крайней мере один инвертированный индекс. Это потому, что для каждого полнотекстового поля в индексе будет свой инвертированный индекс. Поэтому если у вас есть индекс, содержащий документы, которые содержат пять полнотекстовых полей, у вас будет пять инвертированных индексов.

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

Хорошо, давайте посмотрим пример. Предположим, что у нас есть два рецепта со следующими названиями: "The Best Pasta Recipe with Pesto" и "Delicious Pasta Carbonara Recipe". В следующей таблице показано, как будет выглядеть инвертированный индекс.

Термин Документ 1 Документ 2
best X
carbonara X
delicious X
pasta X X
pesto X
recipe X X
the X
with X

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

Выполнение поиска включает в себя множество вещей, таких как релевантность, но давайте пока забудем об этом. Первый шаг поискового запроса - найти документы, которые соответствуют запросу. Так, если бы мы искали "pasta recipe", мы бы увидели, что оба документа содержат оба термина.

Термин Документ 1 Документ 2
best X
carbonara X
delicious X
pasta X X
pesto X
recipe X X
the X
with X

Если бы мы искали "delicious recipe", результаты были бы следующими.

Термин Документ 1 Документ 2
best X
carbonara X
delicious X
pasta X X
pesto X
recipe X X
the X
with X

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

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

Также возможно применение стеблинга слов и синонимов. Это также может быть применено к инвертированному индексу, но я хотел сохранить простоту в этом базовом обзоре инвертированного индекса.

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

 

 

Понравилась статья? Поделиться с друзьями:
Добавить комментарий