Обучение ElasticSearch (1): базовые знания Elasticsearch

Elasticsearch

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

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 для китайского языка, набор инструментов для китайского лексического анализа, разработанный Лабораторией обработки естественного языка и социальных гуманитарных вычислений Университета Цинхуа, с функциями сегментации китайских слов и тегами частей речи.

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, чтобы учиться и развиваться вместе.