Elasticsearch 6.x перевернутый индекс и сегментация слов

задняя часть Elasticsearch поисковый движок NLP

Перевернутый индекс

  • Положительный индекс: связь между идентификатором документа и словом
  • Перевернутый индекс: связь между словами и идентификаторами документов

Пример: Построить инвертированный индекс после удаления стоп-слов для следующих трех документов.

image

Инвертированный индекс - процесс запроса

Запрос документов, содержащих "поисковик"

  1. Получить список идентификаторов документов, соответствующих «поисковику», через инвертированный индекс, есть 1, 3
  2. Запросить полное содержимое 1 и 3 через прямой индекс
  3. вернуть окончательный результат

Перевернутый индекс - состав

  • Словарь терминов
  • Список сообщений

Словарь терминов

Реализация словаря слов обычно использует дерево B+, URL процесса визуализации построения дерева B+:B+ Tree Visualization

О B-деревьях и B+-деревьях

  1. Википедия-B-дерево
  2. Дерево Википедии-B+
  3. Подробное объяснение вставки и удаления B-деревьев и B+-деревьев

image

Список сообщений

  • В перевернутый список записывается набор документов, соответствующий слову, который состоит из перевернутых элементов индекса (постинга).
  • Элемент инвертированного индекса в основном содержит следующую информацию:
    1. Идентификатор документа используется для получения исходной информации.
    2. Частота термина (TF, Частота термина), запись количества раз, когда слово появляется в документе для последующих точек подсчета корреляции.
    3. Положение (публикация), запишите позицию сегментации слова (несколько) в документе, используемый для поиска слов (фраза)
    4. Смещение, которое записывает начальную и конечную позицию слова в документе для выделения

image

В+ деревоВнутренние узлы хранят индексы, листовые узлы хранят данные, где словарь слов — индекс дерева B+, а инвертированный список — данные, которые интегрируются следующим образом

Заметка: Как сравнить размер индекса дерева B+ на китайском и английском языках? сравнение юникода или пиньинь?

image

ES хранит документ в формате JSON, который содержит несколько полей, каждое поле будет иметь свой инвертированный индекс

Причастие

Сегментация слов — это процесс преобразования текста в ряд слов (Термин или Токен), его также можно назвать анализом текста, который в ES называется Analysis.

image

токенизатор

Токенизатор — это компонент ES, специализирующийся на сегментации слов, на английском — Analyzer, его состав следующий:

  • Фильтры символов: обработка исходного текста, например удаление тегов html.
  • Токенизатор: разделите исходный текст на слова по определенным правилам
  • Фильтры токенов: повторная обработка слов, обработанных Tokenizer, таких как строчные буквы, удаление или добавление и т. д.

Порядок вызова токенизатора

image

Analyze API

ES предоставляет интерфейс API, который может тестировать сегментацию слов, чтобы упростить проверку эффектов сегментации слов.

  • Вы можете напрямую указать анализатор для тестирования

image

  • Вы можете напрямую указать поля в индексе для тестирования
POST test_index/doc
{
  "username": "whirly",
  "age":22
}

POST test_index/_analyze
{
  "field": "username",
  "text": ["hello world"]
}
  • Вы можете настроить токенизатор для тестирования
POST _analyze
{
  "tokenizer": "standard",
  "filter": ["lowercase"],
  "text": ["Hello World"]
}

Предопределенные токенизаторы

Токенизаторы, поставляемые с ES, следующие:

  • Standard Analyzer
    • Токенизатор по умолчанию
    • Сегмент по слову, поддержка нескольких языков
    • нижний регистр
  • Simple Analyzer
    • Разделить по не букве
    • нижний регистр
  • Whitespace Analyzer
    • пробел как разделитель
  • Stop Analyzer
    • По сравнению с Simple Analyzer больше удалений, пожалуйста, используйте слова для обработки
    • Стоп-слова относятся к словам-модификаторам, таким как модальные частицы, такие как the, an, of и т. д.
  • Keyword Analyzer
    • Нет сегментации слов, прямой вывод ввода в виде слова
  • Pattern Analyzer
    • Пользовательские разделители с помощью регулярных выражений
    • По умолчанию используется \W+, то есть в качестве разделителей используются несловесные символы.
  • Language Analyzer
    • Предоставляются токенизаторы для 30+ распространенных языков

Пример: Токенизатор стоп-слов

POST _analyze
{
  "analyzer": "stop",
  "text": ["The 2 QUICK Brown Foxes jumped over the lazy dog's bone."]
}

результат

{
  "tokens": [
    {
      "token": "quick",
      "start_offset": 6,
      "end_offset": 11,
      "type": "word",
      "position": 1
    },
    {
      "token": "brown",
      "start_offset": 12,
      "end_offset": 17,
      "type": "word",
      "position": 2
    },
    {
      "token": "foxes",
      "start_offset": 18,
      "end_offset": 23,
      "type": "word",
      "position": 3
    },
    {
      "token": "jumped",
      "start_offset": 24,
      "end_offset": 30,
      "type": "word",
      "position": 4
    },
    {
      "token": "over",
      "start_offset": 31,
      "end_offset": 35,
      "type": "word",
      "position": 5
    },
    {
      "token": "lazy",
      "start_offset": 40,
      "end_offset": 44,
      "type": "word",
      "position": 7
    },
    {
      "token": "dog",
      "start_offset": 45,
      "end_offset": 48,
      "type": "word",
      "position": 8
    },
    {
      "token": "s",
      "start_offset": 49,
      "end_offset": 50,
      "type": "word",
      "position": 9
    },
    {
      "token": "bone",
      "start_offset": 51,
      "end_offset": 55,
      "type": "word",
      "position": 10
    }
  ]
}

Сегментация китайских слов

  • трудность
    • Сегментация китайских слов относится к разделению последовательности китайских иероглифов на отдельные слова. В английском языке пробелы используются как естественные разделители между словами, в то время как в китайских словах формального разделителя нет.
    • Другой контекст, разные результаты сегментации слов, например проблема перекрестной неоднозначности
  • Система сегментации общих слов
    • IK: Реализация сегментации китайских и английских слов, настраиваемый тезаурус, поддержка словаря сегментации слов с горячим обновлением.
    • jieba: поддержка сегментации слов и тегов частей речи, поддержка традиционной сегментации слов, настраиваемого словаря, параллельной сегментации слов и т. д.
    • Hanlp: Java Tool состоит из серии моделей и алгоритмов, состоящих из пакета, направлена ​​на популяцию применения обработки естественного языка в производственной среде
    • THUAC: Сегментация китайских слов и теги по частям речи

Установите плагин сегментации китайских слов ik

# 在Elasticsearch安装目录下执行命令,然后重启es
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip

# 如果由于网络慢,安装失败,可以先下载好zip压缩包,将下面命令改为实际的路径,执行,然后重启es
bin/elasticsearch-plugin install file:///path/to/elasticsearch-analysis-ik-6.3.0.zip
  • ик тест - ik_smart
POST _analyze
{
  "analyzer": "ik_smart",
  "text": ["公安部:各地校车将享最高路权"]
}

# 结果
{
  "tokens": [
    {
      "token": "公安部",
      "start_offset": 0,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "各地",
      "start_offset": 4,
      "end_offset": 6,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "校车",
      "start_offset": 6,
      "end_offset": 8,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "将",
      "start_offset": 8,
      "end_offset": 9,
      "type": "CN_CHAR",
      "position": 3
    },
    {
      "token": "享",
      "start_offset": 9,
      "end_offset": 10,
      "type": "CN_CHAR",
      "position": 4
    },
    {
      "token": "最高",
      "start_offset": 10,
      "end_offset": 12,
      "type": "CN_WORD",
      "position": 5
    },
    {
      "token": "路",
      "start_offset": 12,
      "end_offset": 13,
      "type": "CN_CHAR",
      "position": 6
    },
    {
      "token": "权",
      "start_offset": 13,
      "end_offset": 14,
      "type": "CN_CHAR",
      "position": 7
    }
  ]
}
  • ик тест - ik_max_word
POST _analyze
{
  "analyzer": "ik_max_word",
  "text": ["公安部:各地校车将享最高路权"]
}

# 结果
{
  "tokens": [
    {
      "token": "公安部",
      "start_offset": 0,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "公安",
      "start_offset": 0,
      "end_offset": 2,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "部",
      "start_offset": 2,
      "end_offset": 3,
      "type": "CN_CHAR",
      "position": 2
    },
    {
      "token": "各地",
      "start_offset": 4,
      "end_offset": 6,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "校车",
      "start_offset": 6,
      "end_offset": 8,
      "type": "CN_WORD",
      "position": 4
    },
    {
      "token": "将",
      "start_offset": 8,
      "end_offset": 9,
      "type": "CN_CHAR",
      "position": 5
    },
    {
      "token": "享",
      "start_offset": 9,
      "end_offset": 10,
      "type": "CN_CHAR",
      "position": 6
    },
    {
      "token": "最高",
      "start_offset": 10,
      "end_offset": 12,
      "type": "CN_WORD",
      "position": 7
    },
    {
      "token": "路",
      "start_offset": 12,
      "end_offset": 13,
      "type": "CN_CHAR",
      "position": 8
    },
    {
      "token": "权",
      "start_offset": 13,
      "end_offset": 14,
      "type": "CN_CHAR",
      "position": 9
    }
  ]
}
  • ik В чем разница между двумя режимами сегментации слов ik_max_word и ik_smart?
    • ik_max_word: Текст будет разбит на самые мелкие, например, «Государственный гимн Китайской Народной Республики» будет разбит на «Китайская Народная Республика, Китайский Народ, Китай, Китайский, Народная Республика, Народ, Народ, Народ, Республика, Республика, И, страна, гимн», исчерпает все возможные комбинации;

    • ik_smart: Выполнит самое грубое разделение, например, разделение «Государственного гимна Китайской Народной Республики» на «Государственный гимн Китайской Народной Республики».

обычай причастие

Если встроенная сегментация слов не соответствует требованиям, вы можете настроить сегментацию слов, определив фильтры символов, токенизатор и фильтры токенов.

Character Filters

  • Обработка исходного текста перед Tokenizer, например добавление, удаление или замена символов и т. д.
  • Поставляется со следующим:
    • HTML Strip Character Filter: удаление тегов HTML и преобразование объектов HTML
    • Сопоставление фильтра символов: выполнение операций замены символов
    • Шаблон замена символов фильтра: регулярное замена совпадения
  • Будет влиять на информацию о положении и смещении, анализируемую последующими токенизаторами.

Тест фильтров персонажей

POST _analyze
{
  "tokenizer": "keyword",
  "char_filter": ["html_strip"],
  "text": ["<p>I&apos;m so <b>happy</b>!</p>"]
}

# 结果
{
  "tokens": [
    {
      "token": """

I'm so happy!

""",
      "start_offset": 0,
      "end_offset": 32,
      "type": "word",
      "position": 0
    }
  ]
}

Tokenizers

  • Разделить исходный текст на слова (термин или токен) по определенным правилам
  • Поставляется со следующим:
    • стандартное разбиение по словам
    • буквы разбиваются на несимвольные классы
    • пробел разделяется пробелом
    • URL-адрес UAX Электронная почта разделена в соответствии со стандартом, но почтовый ящик и URL-адрес не разделены
    • Сегментация соединения Ngram и Edge NGram
    • Иерархия путей разделена по пути к файлу

Тест токенизаторов

POST _analyze
{
  "tokenizer": "path_hierarchy",
  "text": ["/path/to/file"]
}

# 结果
{
  "tokens": [
    {
      "token": "/path",
      "start_offset": 0,
      "end_offset": 5,
      "type": "word",
      "position": 0
    },
    {
      "token": "/path/to",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "/path/to/file",
      "start_offset": 0,
      "end_offset": 13,
      "type": "word",
      "position": 0
    }
  ]
}

Token Filters

  • Добавление, удаление, изменение и другие операции над словом (термином), выводимым токенизатором
  • Поставляется со следующим:
    • нижний регистр переводит все термины в нижний регистр
    • stop удаляет стоп-слова
    • Сегментация соединения Ngram и Edge NGram
    • Синоним для добавления терминов-синонимов

Тест фильтров токенов

POST _analyze
{
  "text": [
    "a Hello World!"
  ],
  "tokenizer": "standard",
  "filter": [
    "stop",
    "lowercase",
    {
      "type": "ngram",
      "min_gram": 4,
      "max_gram": 4
    }
  ]
}

# 结果
{
  "tokens": [
    {
      "token": "hell",
      "start_offset": 2,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "ello",
      "start_offset": 2,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "worl",
      "start_offset": 8,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "orld",
      "start_offset": 8,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}

обычай причастие

Для пользовательской сегментации слов необходимо установить char_filter, токенизатор, фильтр, анализатор и т. д. в конфигурации индекса.

Пример пользовательской сегментации слов:

  • Имя токенизатора: my_custom\
  • Фильтр преобразует токен в верхний регистр
PUT test_index_1
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom",
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "uppercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

Пользовательский тест токенизатора

POST test_index_1/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": ["<p>I&apos;m so <b>happy</b>!</p>"]
}

# 结果
{
  "tokens": [
    {
      "token": "I'M",
      "start_offset": 3,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "SO",
      "start_offset": 12,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "HAPPY",
      "start_offset": 18,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}

Инструкция по употреблению причастий

Слово будет использоваться в следующих двух случаях:

  • Когда вы создаете или обновляете документ, обрабатывается соответствующий документ.
  • Во время запроса (время поиска) оператор запроса будет сегментирован
    • Указать токенизатор по анализатору при запросе
    • Установите реализацию search_analyzer через отображение индекса
    • Как правило, нет необходимости указывать токенизатор времени запроса, а токенизатор индекса можно использовать напрямую, в противном случае возникнет ситуация, когда его невозможно будет сопоставить.

предложения по сегментации слов

  • Понятно, нуждается ли поле в сегментации слов.Для полей, которые не нуждаются в сегментации слов, установите тип ключевого слова, что может сэкономить место и повысить производительность записи.
  • Эффективно используйте _analyze API для просмотра результатов сегментации слов в документах.

Для получения дополнительной информации, пожалуйста, посетите мой личный сайт:laijianfeng.org
Справочная документация:

  1. официальная документация elasticsearch
  2. MOOC Elastic Stack от входа до практики

Добро пожаловать в мой публичный аккаунт WeChat

小旋锋微信公众号