Серия Elasticsearch открыта. Начинать всегда приятно. Учись и сдавайся.
Введение в Apache Lucene
Основные концепции Lucene
Apache Lucene — это библиотека полнотекстового поиска, используемая ElasticSearch. Прежде чем понять Lucene, вам нужно понять некоторые понятия:
- Документ: индексируется и выполняется поиск на основном носителе данных, который содержит одно или несколько полей, содержащих данные для записи или поиска в индексе.
- Поле: Фрагмент документа, который представляет собой структуру K-V.
- Термин: Единица при поиске, представляющая слово в тексте.
- Термин: вхождение термина в поле, включая текст термина, начальное и конечное смещения, а также тип
- Инвертированный индекс: инвертированный индекс может быстро найти документы, содержащие определенное слово. Инвертированный индекс состоит из двух частей: словаря слов и инвертированного файла.
- Словарь слов: словарь слов представляет собой набор строк, состоящий из всех слов, которые появились в коллекции документов.Каждый элемент индекса в словаре слов записывает некоторую информацию о самом слове и указатель на «перевернутый список».
- Перевернутый список: перевернутый список записывает список всех документов, в которых появилось определенное слово, и положение слова в документе.Каждая запись называется перевернутым элементом (проводка)
- Инвертированный файл: инвертированный список всех слов часто хранится в определенном файле на диске по порядку.Этот файл называется инвертированным файлом.
Наиболее важным из них является инвертированный индекс.Для удобства понимания рассмотрим простой пример.
Предположим, здесь три предложения:
T[0] = "it is what it is"
T[1] = "what is it"
T[2] = "it is a banana"
Инвертированные индексы обычно имеют два проявления:
- индекс инвертированного файла{термин, идентификатор документа, в котором находится термин}
"a" : {2}
"banana" : {2}
"is" : {0, 1, 2}
"it" : {0, 1, 2}
"what" : {0,1}
- полный инвертированный индекс{термин, (идентификатор документа, в котором находится термин, позиция в конкретном документе)}
"a" : {(2, 2)}
"banana" : {(2, 3)}
"is" : {(0, 1), (0, 4), (1, 1), (2, 1)}
"it" : {(0, 0), (0, 3), (1, 2), (2, 0)}
"what" : {(0, 2), (1, 0)}
Язык запросов Lucene
После понимания некоторых основных концепций Lucene вам также необходимо понять язык запросов Lucene. Запрос обычно делится на термины и операторы, а термины могут быть отдельными словами или фразами. К операторам относятся:
- И: возвращает только в том случае, если документ содержит термины по обе стороны от И.
- ИЛИ: возвращает, если документ содержит какие-либо термины по обе стороны от ИЛИ.
- НЕ: не содержит термина, следующего за оператором НЕ
- +: Будут возвращены только документы, содержащие термин после оператора +. Например, query +lucene apache означает, что lucene должен быть включен, apache может включать или не включать
- -: совпадающие документы не могут отображаться в качестве термина после оператора -
- Двоеточие: заголовок запроса: эластичный поиск означает запрос всех документов, содержащих термин эластичный поиск в поле заголовка.
- Подстановочные знаки (?/*): ? соответствует любому символу, * соответствует любому количеству символов (по соображениям производительности подстановочные знаки не могут использоваться в качестве первого символа термина)
- ~: используется для нечетких запросов в Lucene, целочисленное значение, за которым следует ~, определяет максимальное расстояние редактирования между приблизительным термином и исходным термином. Например, если вы запросите мальчик~2, то оба термина мальчик и мальчики могут совпадать При использовании во фразах это означает максимально допустимое расстояние между терминами.
- ^: используется для взвешивания терминов
- Фигурные скобки: указывает на запрос диапазона
Для некоторых запросов со специальными символами мы обычно используем обратную косую черту для выхода.
Основные концепции Elasticsearch
Разобравшись с основными понятиями Lucene, давайте вернемся к теме и рассмотрим некоторые основные понятия Elasticsearch, которые могут иметь некоторые повторения с Lucene, но все же есть некоторые специфичные для Elasticsearch свойства.
- **Индекс (index): **Данные хранятся в индексе. Документы могут быть записаны в индекс или прочитаны из него.Индекс Elasticsearch может состоять из одного или нескольких индексов Lucene.
- **документ (document):** документ состоит из полей, каждое поле имеет свое имя поля и одно или несколько значений поля
- **сопоставление:** используется для хранения метаинформации, которая определяет, как разбить входной текст на термины, какие термины следует отфильтровать и т. д.
- **Тип (type):** Каждый документ имеет соответствующий тип. Структура данных документов одного типа обычно непротиворечива, и разные документы могут иметь разные сопоставления. Но это понятие было удалено после Elasticsearch7.
- **Узел (узел):** Каждый экземпляр ES в кластере называется узлом.
- **Кластер: **В производственной среде объем данных и давление запросов могут превышать нагрузку на одну машину, поэтому для совместной обработки требуется несколько узлов.
- **Shard: **ES разбросает данные по нескольким индексам Lucene. Эти индексы Lucene называются осколками. ES автоматически выполнит обработку фрагментации
- **Реплика (реплика):** ES создаст избыточные копии для каждого шарда, с одной стороны, чтобы разделить давление запросов, с другой стороны, чтобы гарантировать, что данные не будут потеряны. ES поддерживает добавление или удаление реплик в любой момент времени.
Процесс запуска Elasticsearch
Когда Elasticsearch запускается, он использует широковещательную технологию для обнаружения других узлов в том же кластере, и один узел в кластере будет выбран в качестве главного узла. Главный узел отвечает за управление состоянием кластера и реагирование на изменения количества узлов в кластере. Но с точки зрения пользователя мастер-узел ничем не отличается от других узлов, и команды могут быть отправлены на выполнение любому узлу.
Главный узел проверяет все осколки и решает, какие осколки являются первичными. После определения основного сегмента статус кластера становится желтым, и в это время можно получать запросы. Затем главный узел решит, создавать ли реплики для каждого шарда, и после того, как с репликами проблем не возникнет, статус кластера станет зеленым.
Статус кластера Elasticsearch делится на 3 типа:
- Зеленый: все в порядке
- Желтый: все данные доступны, но для некоторых осколков не выделены реплики.
- Красный: некоторые данные недоступны
Что касается процесса запуска Elasticsearch, более подробное обсуждение будет позже.
Быть в курсе.