1. Стек эластичного поиска
- Elastic Stack включает Elasticsearch, Kibana, Beats и Logstash (также известный как стек ELK) для безопасного и надежного приема данных из любого источника в любом формате, а затем поиска, анализа и визуализации в режиме реального времени.
- Elaticsearch упоминается как ES.ES — это высокомасштабируемая распределенная полнотекстовая поисковая система с открытым исходным кодом, которая является ядром всего стека технологий Elastic Stack. Он может хранить и извлекать данные практически в режиме реального времени, обладает хорошей масштабируемостью и может быть расширен до сотен серверов для обработки данных уровня PB.
- Elasticsearch — это поисковая система с открытым исходным кодом, основанная на Apache Lucene, библиотеке полнотекстовой поисковой системы.
- Elasticsearch написан на Java. Он использует Lucene для внутреннего индексирования и поиска. Скрывая сложность Lucene, вместо этого он предоставляет простой и согласованный RESTful API.
- Elasticsearch описывает
- Распределенное хранилище документов в реальном времени, где каждое поле можно индексировать и искать.
- Распределенная аналитическая поисковая система в реальном времени
- Возможность масштабирования сотен сервисных узлов и поддержка структурированных или неструктурированных данных на уровне PB.
- Кросс-платформенный, кросс-системный, кросс-языковый, для получения данных нужно только отправить запрос через http
- Адрес источника GitHub:GitHub.com/эластик/голодный…
- Elasticsearch — это документно-ориентированная база данных, часть данных — это документ, проводится аналогия между концепцией хранения данных документа в Elasticsearch и концепцией хранения данных в реляционной базе данных MySQL.
Реляционная база данных |
ELasticsearch |
база данных (база данных) |
index (библиотека индексов) |
таблица (таблица данных) |
тип (тип) |
строка (строка данных) |
документ (документ) |
Поле (столбец данных) |
поле (поле) |
- Основной формат: протокол://ip:порт/индекс/тип/запись
- Кластер ES может содержать несколько библиотек индексов, и каждая библиотека индексов содержит множество типов (Устарело после ES7), тип может содержать несколько документов, и каждый документ может содержать несколько полей.
- Только один пост-ES7 тип_doc, используется для решения поиска по ключевому слову, которое необходимо для поиска документов разных типов.
- Эквивалентен всем данным в одной таблице данных, поэтому не будет перекрестного запроса, который может ускорить поиск.
- JSON как формат для сериализации документов, таких как информация о пользователе.
{
"name" : "TianXinCoord",
"email" : "tianxincoord@163.com",
"about" : "Elasticsearch",
"interests": [ "code", "music" ]
}
Во-вторых, инвертированный индекс
2.1 Перевернутый индекс
- Инвертированный индекс возникает из-за необходимости поиска записей по значению атрибута в практических приложениях.Каждый элемент в индексной таблице включает значение атрибута и адрес каждой записи со значением атрибута.
- Поскольку значение атрибута не определяется записью, а расположение записи определяется значением атрибута, он называется инвертированным индексом.
- Файл с инвертированным индексом называется инвертированным индексным файлом или сокращенно инвертированным файлом.
- Объекты индекса в инвертированном индексе — это слова в документе или коллекции документов и т. д., которые используются для хранения места хранения этих слов в документе или группе документов.Это один из наиболее часто используемых индексов механизмы для документов или коллекций документов.
- Ключевым шагом поисковой системы является создание инвертированного индекса. Инвертированный индекс обычно выражается в виде ключевого слова, за которым следует его частота (количество раз, когда оно появляется), его местоположение (в какой статье или веб-странице оно появляется, и соответствующую дату, автора и другую информацию), точно так же, как оглавление и метки книги. Читатели хотят видеть, какая глава относится к теме, и могут найти соответствующую страницу непосредственно в соответствии с оглавлением, не переходя от первой до последней страницы книги. Найдите одну страницу
- Lucene использует инвертированную структуру файлового индекса. В следующем примере представлена структура и соответствующий алгоритм генерации. Предположим, что есть две статьи, статья 1 и статья 2.
- Содержание статьи 1: Том живет в Гуанчжоу, я тоже живу в Гуанчжоу.
- Содержание статьи 2 таково: Жил когда-то в Шанхае.
2.2 Получите ключевые слова
- Поскольку Lucene основана на индексации ключевых слов и запросах, в первую очередь для получения ключевых слов этих двух статей, обычно требуются следующие меры.
- Теперь есть содержание статьи, то есть строка, сначала нужно найти все слова в строке, то есть сегментация слов
- Английские слова легче обрабатывать, поскольку они разделены пробелами, а поскольку китайские слова связаны друг с другом, требуется специальная сегментация слов.
- Такие слова, как «в», «один раз» и «тоже» в статье не имеют практического значения, а такие слова, как «的» «есть» в китайском языке обычно не имеют конкретного значения.Эти слова, не представляющие понятия, могут быть отфильтровано.
- Пользователи обычно хотят найти статьи, содержащие «он» и «ОН», когда ищут «Он», поэтому все слова должны быть написаны с большой буквы.
- Пользователи обычно хотят найти статьи, содержащие «жизни» и «жили», когда они ищут «живые», поэтому им нужно восстановить «жизни» и «жилые» на «живые».
- Знаки препинания в статьях обычно не представляют собой понятия и также могут быть отфильтрованы.
- В Lucene вышеуказанные меры выполняются классом Analyzer.После вышеуказанной обработки получаются следующие результаты
- Все ключевые слова статьи 1: 【tom】【live】【guangzhou】【i】【live】【guangzhou
- Все ключевые слова статьи 2: 【он】【live】【shanghai】
2.3 Создание инвертированного индекса
- После того, как у вас есть ключевые слова, вы можете создать инвертированный индекс
- Соответствующее отношение выше: «номер статьи» к «всем ключевым словам в статье».
- Инвертированный индекс меняет эту связь и превращает «ключевое слово» в «все номера статей с этим ключевым словом».
- Мало знать какие есть ключевые слова, нужно еще знать количество и положение ключевых слов в тексте, обычно есть два вида позиций
- Позиция символа, то есть запись слова является первым символом в статье (преимущество заключается в том, что он может быстро отображать и находить ключевые слова)
- Позиция ключевого слова, то есть для записи слова является первым ключевым словом в статье (преимущество в том, что место в индексе экономится, а фразовый запрос выполняется быстро), это позиция, записанная в Lucene.
- После добавления информации о «частоте возникновения» и «местоположении появления» структура индекса выглядит следующим образом.
- [Ключевые слова] [номер статьи], который появляется в статье, появляется [несколько раз (частота появления)], а позиции [появление позиции]
- При реализации Lucene сохраняет указанные выше три столбца как файл словаря (словарь терминов), файл частот (частоты) и файл позиций (позиции) соответственно.
- Файл словаря не только сохраняет каждое ключевое слово, но также сохраняет указатель на файл частоты и файл местоположения, с помощью которых можно найти информацию о частоте и местоположении ключевого слова.
- Концепция поля используется в Lucene для обозначения местоположения информации (например, в заголовке, в статье, в URL-адресе) в построении индекса, информация о поле также записывается в файл словаря, каждое ключевое слово имеет информация о поле, поскольку каждое ключевое слово должно принадлежать одному или нескольким полям
3. Терминология
3.1 Термин индекса (term)
- Индексируемый термин в Elasticsearch — это точное значение, которое можно индексировать.
- methodRefrence, Foo, FOO несколько одиночных делений являются разными индексными словами
- Индексные термины (термины) могут быть точно найдены по терминологическим запросам
3.2 Текст
- Текст — это обычный фрагмент неструктурированного текста, эквивалентный необработанным данным.
- Обычно текст анализируется на индексные слова одно за другим и сохраняется в индексной библиотеке Elasticsearch.
- Чтобы текст был доступен для поиска, текстовое поле должно быть предварительно проанализировано.
- При запросе ключевых слов в тексте поисковая система должна искать исходный текст в соответствии с условиями поиска.
3.3 Анализ
- Анализ — это процесс преобразования текста в индексные слова. Результаты анализа зависят от токенизатора. Например, слова FOO BAR, Foo-Bar и foo bar могут быть проанализированы в одни и те же индексные слова foo и bar. Слова сохраняются в индексной библиотеке Elasticsearch
- При использовании FoO:bAR для полнотекстового поиска поисковая система также может искать предыдущий контент в библиотеке индексов в соответствии с расчетом соответствия, который представляет собой поисковый анализ Elasticsearch.
3.4 Кластер (кластер)
- Кластер состоит из одного или нескольких узлов, предоставляющих внешние службы, функции индексирования и поиска.
- Кластер имеет уникальное имя по умолчанию «elasticsearch» на всех узлах, это имя важно, потому что каждый узел может быть только частью кластера, когда для узла установлено одно и то же имя кластера, он автоматически присоединится к кластеру.
- Если требуется несколько кластеров, убедитесь, что имя каждого кластера не может повторяться, иначе узлы могут присоединиться к неправильному кластеру.
- Обратите внимание, что узел может присоединиться только к одному кластеру. Кроме того, у вас может быть несколько независимых кластеров, каждый со своим собственным именем кластера. Например, в процессе разработки вы можете создать библиотеку кластера разработки и библиотеку тестового кластера, которые служат для разработки и тестирования соответственно.
3.5 Узел (узел)
- Узел — это логически независимая служба, которая является частью кластера и может хранить данные и участвовать в функциях индексирования и поиска кластера. Как и кластеры, узлы также имеют уникальные имена, которые присваиваются при запуске. Если вам не нужно имя по умолчанию, вы можете определить любое имя узла, которое хотите.
- Это имя важно для управления, в сети кластер Elasticsearch управляется и передается по имени узла.
- Узел может быть настроен для присоединения к определенному кластеру. По умолчанию каждый узел будет присоединяться к кластеру с именем Elasticsearch, что означает, что если вы запускаете несколько узлов в сети, если сеть свободна, они могут обнаруживать друг друга и автоматически присоединяться к кластеру с именем Elasticsearch.
- В кластере у вас может быть несколько желаемых узлов.Если в сети нет запущенного кластера, пока какой-либо узел запущен, этот узел по умолчанию будет генерировать новый кластер, и этот кластер будет иметь один узел
3.6 Маршрутизация
- При хранении документа он хранится в уникальном первичном шарде, который выбирается по хеш-значению.
- По умолчанию это значение генерируется из идентификатора документа. Если документ имеет указанный родительский документ, он создается из идентификатора родительского документа, который можно изменить при сохранении документа.
3.7 Шардинг (осколок)
- Осколок — это отдельный экземпляр Lucene, низкоуровневая функция, управляемая Elasticsearch.
- Индекс — это логическое пространство, указывающее на основной сегмент и сегмент реплики.Для использования вам нужно только указать количество сегментов, и вам не нужно делать слишком много.
- В процессе разработки и использования соответствующие нам объекты являются индексами, и Elasticsearch будет автоматически управлять всеми шардами в кластере, при сбое Elasticsearch переместит шарды на другие узлы или добавит новые узлы.
- В индексе могут храниться очень большие объемы данных, которые могут превышать ограничения физического хранилища узла. Например, миллиард документов занимает 1 ТБ дискового пространства, поиск только с одного узла может быть медленным, а одна физическая машина не обязательно может хранить столько данных.
- Чтобы решить эту проблему, Elasticsearch разбивает индекс на несколько сегментов, при создании индекса вы можете просто указать нужное количество сегментов.
- Каждый осколок сам по себе является полнофункциональным автономным блоком, который может быть размещен на любом узле кластера.
3.8 Первичный шард
- Каждый документ хранится в сегменте, когда вы сохраняете документ, система сначала сохраняет его в основном сегменте, а затем реплицирует в другую реплику.
- Количество осколков можно указать заранее.
3.9 Осколок реплики
- Каждый сегмент имеет ноль или более реплик, и реплики в основном являются репликами основного сегмента, которые служат двум целям.
- Высокая доступность: в случае сбоя основного сегмента один из сегментов реплики может быть выбран в качестве основного сегмента.
- Повышение производительности: при запросе вы можете запрашивать основной сегмент или сегмент реплики.
- По умолчанию первичный шард оснащен одной репликой, но количество реплик можно динамически настроить позже.
- Осколки реплик должны быть развернуты на разных узлах, а не на том же узле, что и основной осколок.
- Есть две важные причины для шардинга
- Разрешить горизонтальное разделение
- Расширенные данные
3.10 Указатель (Индекс)
- Индекс — это набор документов с похожими характеристиками, например, это может быть индекс данных о клиентах, еще один индекс каталогов продуктов и индекс данных о заказах.
- Индекс идентифицируется по имени (Должны быть все строчные буквы), и когда мы хотим индексировать, искать, обновлять и удалять документы в этом индексе, мы должны использовать это имя
- В кластере может быть определено любое количество индексов, и данные, которые можно искать, должны быть проиндексированы, что имеет преимущество в повышении скорости запроса.Например, каталог перед словарем Синьхуа означает индекс, а каталог может улучшить скорость запроса.
- Суть индексации Elasticsearch: все предназначено для повышения эффективности поиска
3.11 Тип (Тип)
- Внутри индекса может быть определен один или несколько типов
- Тип — это логическая классификация/раздел индекса, семантика которого может быть полностью определена.
- Обычно тип определяется для документа с общим набором полей, разные версии имеют разные изменения типа
Версия |
Type |
5.x |
Поддержка нескольких типов |
6.x |
только один тип |
7.x |
Пользовательские типы индексов больше не поддерживаются по умолчанию (тип по умолчанию: _doc). |
3.12 Документ (Документ)
- Документ — это базовая информационная единица, которую можно индексировать, то есть часть данных, например, это может быть документ для клиента, документ для продукта и, конечно же, документ для заказа.
- Документы представлены в формате JSON (Javascript Object Notation), а JSON является распространенным форматом обмена данными в Интернете.
- Внутри индекса/типа вы можете хранить столько документов, сколько хотите.
3.13 Поле (Поле)
- Это эквивалентно полю таблицы данных, а также классификации и идентификации данных документа по различным атрибутам.
3.14 Отображение
- Отображение заключается в том, чтобы наложить некоторые ограничения на способ и правила обработки данных, такие как: тип данных поля, значение по умолчанию, анализатор, нужно ли индексировать и т. д.
- Это все настройки, которые можно задать в маппинге.Другие это некоторые настройки правил использования для обработки данных в ЭС,также называемые мэппингом.Обработка данных по оптимальным правилам значительно повысит производительность.Поэтому необходимо установить маппинг, и надо думать как наладить маппинг лучше для производительности
3.15 Распределение
- Процесс назначения осколков узлу, включая назначение первичных осколков или реплик.
- Если это реплика, она также включает в себя процесс копирования данных из основного сегмента, который выполняется мастер-узлом.