1. Начало работы с Elasticsearch
1. Введение в терминологию
- Документ Документ: документ данных, который пользователь хранит в es
- Индекс Индекс: состоит из списка документов с одинаковыми полями.
- Узел Узел: работающий экземпляр Elasticsearch, который является составной частью кластера.
- Кластер: состоит из одного или нескольких узлов, предоставляющих внешние услуги.
2. Введение документа
Json Object, состоящий из полей (Field), общие типы данных следующие:
- Строка: текст, ключевое слово
- Числовые: long, integer, short, byte, double, float, half_float, scaled_float
- логическое значение: логическое значение
- дата: дата
- двоичный: двоичный
- Типы диапазонов: integer_range, float_range, long_range, double_range, date_range
Каждый документ имеет уникальный идентификационный флаг
- самопровозглашенный
- es генерируется автоматически
Document MetaData
Метаданные, которые используются для аннотирования релевантной информации о документе.
- _index: имя индекса, в котором находится документ
- _type: имя типа, в котором находится документ
- _id: уникальный идентификатор документа
- _uid: Комбинированный идентификатор, состоящий из _type и _id (6.X _type больше не работает, как и _id)
- _source: Исходные данные Json документа, содержимое каждого поля можно получить отсюда
- _all: интегрировать все содержимое поля в это поле, отключено по умолчанию.
3. Введение в Индекс
- Документы с одинаковой структурой хранятся в индексе
- Каждый индекс имеет собственное определение сопоставления, которое определяет имена и типы полей.
- Кластер может иметь несколько индексов, например:
- Когда журнал nginx хранится, индекс может генерироваться каждый день в соответствии с датой хранения.
- nginx-log-2017-01-01
- nginx-log-2017-01-02
- nginx-log-2017-01-03
- Когда журнал nginx хранится, индекс может генерироваться каждый день в соответствии с датой хранения.
4. Знакомство с рестапи
- Кластер Elasticsreach предоставляет внешний API RESTful
- REST - REpresentational State Transfer
- URI указывает ресурсы, такие как индекс, документ и т. д.
- Метод Http указывает тип операции с ресурсом, например GET, POST, PUT, DELETE и т. д.
- Два часто используемых метода взаимодействия
- Свернуть командную строку
- Kibana DevTools
5. index_api
es имеет специальный Index API для создания, обновления, удаления конфигураций индекса и т. д.
Thpffcj:elasticsearch-6.5.4 thpffcj$ bin/elasticsearch
Thpffcj:kibana-6.5.4-darwin-x86_64 thpffcj$ bin/kibana
- Получите доступ к порту localhost: 5601 для доступа к графическому интерфейсу кибаны, мы можем использовать REST API с помощью Kibana DevTools.
PUT /test_index
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0; if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "test_index"
}
GET _cat/indices
yellow open test_index xbR-XQYDT7C-4GZZ1vRjfA 5 1 0 0 1.1kb 1.1kb
DELETE /test_index
{
"acknowledged" : true
}
6. document_api
es имеет специальный API для документов
-
Создать документацию
-
документ запроса
-
обновить документацию
-
удалить документ
-
Создайте документ с индексом как test_index, введите как doc и id как 1. После более высокой версии нет концепции типа
PUT /test_index/doc/1
{
"username":"thpffcj",
"age":22
}
{
"_index" : "test_index",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- Создать документ без указания идентификатора
POST /test_index/doc
{
"username":"tom",
"age":20
}
{
"_index" : "test_index",
"_type" : "doc",
"_id" : "yfg31mwBWHG_wS6wM641",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- Указывает идентификатор документа для запроса
GET /test_index/doc/1
{
"_index" : "test_index",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"username" : "thpffcj",
"age" : 22
}
}
- Для поиска по всем документам используйте _search
GET /test_index/doc/_search
{
"took" : 12, 查询耗时,单位ms
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2, 符合条件的总文档数
"max_score" : 1.0,
"hits" : [ 返回文档详情数据数据,默认前10个文档
{
"_index" : "test_index", 索引名
"_type" : "doc",
"_id" : "yfg31mwBWHG_wS6wM641", 文档的id
"_score" : 1.0, 文档的得分
"_source" : { 文档详情
"username" : "tom",
"age" : 20
}
},
{
"_index" : "test_index",
"_type" : "doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"username" : "thpffcj",
"age" : 22
}
}
]
}
}
- Укажите условия запроса
GET /test_index/doc/_search
{
"query": {
"term": {
"_id":"1"
}
}
}
-
es позволяет создавать несколько документов одновременно, тем самым снижая нагрузку на передачу по сети и увеличивая скорость записи.
- конечная точка _bulk
- конечная точка _mget
POST _bulk
{"index":{"_index":"test_index","_type":"doc","_id":"3"}}
{"username":"lilei","age":10}
{"delete":{"_index":"test_index","_type":"doc","_id":"1"}}
{"update":{"_index":"test_index","_type":"doc","_id":"2"}}
{"doc":{"age":100}}
GET _mget
{
"docs": [
{
"_index": "test_index",
"_type": "doc",
"_id": "1"
},
{
"_index": "test_index",
"_type": "doc",
"_id": "2"
}
]
}
2. Инвертированный индекс Elasticsearch и сегментация слов
1. Содержание и указатель книг
Как найти страницу, на которой находится ключевое слово «ACID»?
Книги и поисковые системы
- Страница каталога соответствует прямому индексу
- Индексная страница соответствует инвертированному индексу
2. Введение в прямые и инвертированные индексы
- положительный индекс
- Идентификатор документа для содержания документа, ассоциация слов
- Перевернутый индекс
- Связь идентификатора слова с документом
- Запрос документов, содержащих "поисковик"
- Идентификатор документа, соответствующий «поисковику», полученный по инвертированному индексу, имеет 1 и 3
- Запросить полное содержимое 1 и 3 через прямой индекс
- Вернуть окончательный результат пользователя
3. Подробное объяснение перевернутого индекса
- Инвертированный индекс является ядром поисковой системы и в основном состоит из двух частей:
- Словарь терминов
- является важной составляющей инвертированного индекса
- Запишите слова всех документов, как правило, большего размера
- Запишите ассоциативную информацию слов в инвертированный список
- Реализация словаря слов обычно использует дерево B+.
- Список сообщений
- Записывается набор документов, соответствующих словам, состоящий из элементов инвертированного индекса (Posing)
- В основном это следующая информация:
- Идентификатор документа, используемый для получения исходной информации
- Частота слов (TF, Частота терминов), запишите, сколько раз слово появляется в документе, для последующей оценки корреляции.
- Позиция (Position), запись положения сегментации слова (несколько) в документе, используемого для поиска слова (Phrase Query)
- Смещение, которое записывает начальную и конечную позицию слова в документе для выделения
- Словарь терминов
- es хранит документ в формате json, который содержит несколько полей, каждое поле будет иметь свой инвертированный индекс
4. Введение в сегментацию слов
- Сегментация слов относится к процессу преобразования текста в ряд слов (терминов или токенов), который также можно назвать анализом текста, который называется анализом в es.
- Токенизатор — компонент es, специализирующийся на сегментации слов, имеет следующий состав:
- Фильтры символов: обработка исходного текста, например удаление специальных тегов html.
- Токенизатор: разделите исходный текст на слова по определенным правилам
- Фильтры токенов: повторная обработка слов, обработанных токенизатором, таких как нижний регистр, удаление или добавление и т. д.
5. analyze_api
es предоставляет API-интерфейс для тестирования сегментации слов, который удобен для проверки эффекта сегментации слов.
- Вы можете напрямую указать анализатор для тестирования
POST _analyze
{
"analyzer": "standard", 分词器
"text": "hello world!" 测试文本
}
{
"tokens" : [
{
"token" : "hello", 粉刺结果
"start_offset" : 0, 起始偏移
"end_offset" : 5, 结束偏移
"type" : "<ALPHANUM>",
"position" : 0 分词位置
},
{
"token" : "world",
"start_offset" : 6,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
- Вы можете напрямую указать поля в индексе для тестирования
POST test_index/_analyze
{
"field": "username",
"text": "hello world!"
}
- Вы можете настроить токенизатор для тестирования
POST _analyze
{
"tokenizer": "standard",
"filter": ["lowercase"],
"text": "hello world!"
}
6. Поставляется с токенизатором
es поставляется со следующими токенизаторами
- Standard
- Токенизатор по умолчанию
- Сегмент по слову, поддержка нескольких языков
- Simple
- Разделить по не букве
- Whitespace
- Разделить по пробелу
- Stop
- Больше обработки Stop World, чем Simple Analyzer
- Keyword
- Нет сегментации слов, прямой вывод ввода в виде слова
- Pattern
- Пользовательские разделители с помощью регулярных выражений
- По умолчанию используется \W+, то есть в качестве разделителей используются несловесные символы.
- Language
- Предусмотрены токенизаторы для 30+ распространенных языков
7. Сегментация китайских слов
- трудность
- Сегментация китайских слов – это разделение последовательности китайских иероглифов на отдельные слова. В английском языке пробелы используются в качестве естественных разделителей слов. Китайские слова не имеют формального разделителя.
- Другой контекст, разные результаты сегментации слов
- Система сегментации общих слов
- IK
- Реализовать сегментацию китайских и английских слов
- Настраиваемый тезаурус, поддержка словаря сегментации слов в горячем обновлении
- jieba
- Самая популярная система сегментации слов в Python, поддерживающая сегментацию слов и теги частей речи.
- Поддержка традиционной сегментации слов, пользовательского словаря, параллельной сегментации слов и т. д.
- Hanlp
- Набор инструментов Java, состоящий из ряда моделей и алгоритмов с целью популяризации использования обработки естественного языка в производственных средах.
- THULAC
- THU Lexical Analyzer для китайского языка, набор инструментов для китайского лексического анализа, разработанный Лабораторией обработки естественного языка и социальных гуманитарных вычислений Университета Цинхуа, с функциями сегментации китайских слов и тегами частей речи.
- IK
8. Фильтр символов для пользовательской сегментации слов
- Когда встроенная сегментация слов не может удовлетворить потребности, вы можете настроить сегментацию слов.
- Реализовано пользовательским фильтром символов, токенизатором и фильтром токенов.
Character Filter
- Обработка исходного текста перед Tokenizer, например добавление, удаление или замена символов и т. д.
- Поставляется со следующим:
- HTML Strip удаляет HTML-теги и преобразует HTML-объекты
- Сопоставление для замены символов
- Замена шаблона для обычной подходящей замены
- Будет влиять на информацию о положении и смещении, анализируемую последующими токенизаторами.
9. Токенизатор для пользовательской сегментации слов
- Разделить исходный текст на слова (термин или токен) по определенным правилам
- Поставляется со следующим:
- стандарт: разделить по словам
- буква: разделена по несимвольному классу
- пробел: разделен пробелом
- Электронная почта URL-адреса UAX: разделена в соответствии со стандартом, но не разделяет почтовый ящик и URL-адрес
- NGram и Edge NGram: сегментация соединений
- Иерархия путей: Вырезать в соответствии с путем к файлу
10. Token Filter для пользовательской сегментации слов
- Добавление, удаление, изменение и другие операции над словами (терминами), выводимыми Tokenizer
- Поставляется со следующим:
- нижний регистр: преобразовать все термины в нижний регистр
- стоп: удалить стоп-слова
- NGram и Edge NGram: сегментация соединений
- Синоним: термин для добавления синонимов
11. Пользовательская сегментация слов
- Пользовательская сегментация слов должна быть установлена в конфигурации индекса.
PUT test_index_1
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
- Тестовый эффект
POST test_index_1/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>a box</b>?"
}
{
"tokens" : [
{
"token" : "is",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "this",
"start_offset" : 3,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "a",
"start_offset" : 11,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "box",
"start_offset" : 13,
"end_offset" : 20,
"type" : "<ALPHANUM>",
"position" : 3
}
]
}
12. Инструкции по сегментации слов
- Причастия употребляются в следующих двух ситуациях:
- Когда документ создается или обновляется (индексное время), соответствующий документ будет сегментирован.
- Во время запроса (время поиска) оператор запроса будет сегментирован
- Как правило, нет необходимости указывать токенизатор времени запроса, а токенизатор времени индексирования можно использовать напрямую, иначе совпадения не будет.
Предложения по употреблению причастий
- Понятно, нуждается ли поле в сегментации слов.Для полей, которые не нуждаются в сегментации слов, установите тип ключевого слова, что может сэкономить место и повысить производительность записи.
- Эффективно используйте _analyze API для просмотра результатов сегментации конкретных слов в документе.
- практический тест
3. Сопоставление настроек Elasticsearch
1. Введение в картографирование
- Аналогично определению структуры таблицы в базе данных, основные функции таковы:
- Определите имя поля в разделе «Индекс» (имя поля).
- Определите тип поля, например числовой, строковый, логический и т. д.
- Определите конфигурацию, связанную с инвертированным индексом, например, нужно ли индексировать, положение записи и т. д.
GET /test_index/_mapping
{
"test_index" : {
"mappings" : {
"doc" : {
"properties" : {
"age" : {
"type" : "long"
},
"username" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
2. Пользовательское сопоставление
- После того, как тип поля в Mapping установлен, изменять его напрямую запрещено по следующим причинам:
- Перевернутый индекс, реализованный Lucene, не может быть изменен после его создания.
- Перестройте новый индекс, а затем выполните операцию переиндексации.
- Разрешить добавление полей
- Автоматически добавлять поля для контроля через динамические параметры
- true (по умолчанию): разрешить автоматические новые поля
- false: автоматическое добавление полей не разрешено, но документ может быть написан нормально, но поле не может быть запрошено и другие операции
- строгий: документ не может быть записан, и сообщается об ошибке
- Автоматически добавлять поля для контроля через динамические параметры
3. Демонстрация карты
PUT my_index
{
"mappings": {
"doc": {
"dynamic": false,
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
}
}
}
}
}
- ввод данных
PUT my_index/doc/1
{
"title": "hello world",
"desc": "nothing here"
}
{
"_index" : "my_index",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- Данные запроса
GET my_index/doc/_search
{
"query": {
"match": {
"title": "hello"
}
}
}
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my_index",
"_type" : "doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"title" : "hello world",
"desc" : "nothing here"
}
}
]
}
}
GET my_index/doc/_search
{
"query": {
"match": {
"title": "here"
}
}
}
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
4. описание параметра copy_to
- Скопируйте значение поля в целевое поле, чтобы добиться эффекта, аналогичного _all.
- Не появится в _source, используется только для поиска
5. Описание параметра индекса
- Определяет, индексируется ли текущее поле, по умолчанию установлено значение true, то есть индекс записывается, а значение false не записывается, то есть недоступно для поиска
PUT my_index
{
"mappings": {
"doc": {
"properties": {
"cookie": {
"type": "text",
"index": false
}
}
}
}
}
6. Описание параметра index_options
- index_options используется для управления содержимым записей инвертированного индекса, существует четыре следующих конфигурации:
- документы записывают только идентификатор документа
- freqs записывает идентификатор документа и частоты терминов
- позиции записи идентификатора документа, частоты терминов и позиции термина
- смещения записи идентификатора документа, частота терминов, положение термина и смещения символов
- Конфигурация по умолчанию для текстового типа — positions, а для остальных — docs.
- Чем больше записанного контента, тем больше места он занимает
PUT my_index
{
"mappings": {
"doc": {
"properties": {
"cookie": {
"type": "text",
"index_options": "offsets"
}
}
}
}
}
- null_value
- Стратегия обработки, когда поле встречает нулевое значение, по умолчанию это нулевое значение, то есть пустое значение. В этом случае es будет игнорировать значение. Вы можете установить значение поля по умолчанию, установив это значение.
7. Типы данных
- основные типы данных
- Строковый текст, ключевое слово
- Числовое длинное, целое, короткое, байтовое, двойное, с плавающей запятой, half_float, scaled_float
- дата тип дата
- логический тип логический
- бинарный двоичный тип
- Типы диапазонов integer_range, float_range, long_range, double_range, date_range
- сложные типы данных
- массив типа массива
- объект типа объекта
- Вложенный объект вложенного типа
- Тип данных геолокации
- geo_point
- geo_shape
- Выделенный тип
- записать ip адрес ip
- Реализовать автозаполнение
- Запишите количество токенов token_count
- Запишите хеш-значение строки murmur3
- percolator
- join
- Мультиполя с несколькими полями
- Для одного и того же поля разрешены различные конфигурации, например сегментация слов. Типичным примером является реализация поиска пиньинь по имени человека. Просто добавьте подполе пиньинь к имени человека.
8. Введение в динамическое отображение
- es может автоматически определять типы полей документа, тем самым снижая затраты пользователей на использование.
- es использует тип поля документа JSON для автоматической идентификации типа поля.
9. Динамическое распознавание даты и номера
- Автоматическая идентификация даты может настроить формат даты самостоятельно для удовлетворения различных потребностей.
- Когда строка является числом, она не распознается автоматически как целое число по умолчанию, потому что вполне разумно иметь число в строке.
10. Введение в динамический шаблон
- Разрешается динамически устанавливать тип поля в соответствии с типом данных, именем поля и т. д., автоматически распознаваемым es, что позволяет добиться следующих эффектов:
- Все типы строк настроены на тип ключевого слова, то есть по умолчанию нет сегментации слов.
- Все поля, начинающиеся с сообщения, имеют текстовый тип, то есть сегментацию по словам.
- Все поля, начинающиеся с long_, имеют тип long
- Все автоматически совпадающие двойные типы устанавливаются как плавающие для экономии места.
- Правила сопоставления обычно имеют следующие параметры:
- match_mapping_type соответствует типам полей, автоматически распознаваемым es, например логическим, длинным, строковым и т. д.
- совпадение, несоответствие имя поля совпадения
- path_match, path_unmatch соответствуют путям
PUT test_index
{
"mappings": {
"doc": {
"dynamic_templates": [
{
"message_as_text": {
"match_mapping_type": "string",
"match": "message",
"mapping": {
"type": "text"
}
}
},
{
"string_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
PUT test_index/doc/1
{
"name": "Thpffcj",
"message": "hello world"
}
- Просмотр типов индексов
GET test_index/_mapping
{
"test_index" : {
"mappings" : {
"doc" : {
"dynamic_templates" : [
{
"message_as_text" : {
"match" : "message",
"match_mapping_type" : "string",
"mapping" : {
"type" : "text"
}
}
},
{
"string_as_keywords" : {
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword"
}
}
}
],
"properties" : {
"message" : {
"type" : "text"
},
"name" : {
"type" : "keyword"
}
}
}
}
}
}
11. Предложения по пользовательскому сопоставлению
- Этапы работы пользовательского сопоставления следующие:
- Запишите документ во временный индекс es и получите сопоставление, автоматически сгенерированное es
- Измените сопоставление, полученное на шаге 1, и настройте соответствующую конфигурацию.
- Используйте сопоставление с шага 2, чтобы создать фактический желаемый индекс.
12. Шаблоны указателей
В конце концов
Вы можете подписаться на мою общедоступную учетную запись WeChat, чтобы учиться и развиваться вместе.