Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›Анализ текста ›Справочник по фильтрам токенов

Фильтр токенов Word delimiter graph

Разделяет токены по неалфавитно-цифровым символам. Фильтр word_delimiter_graph также выполняет необязательную нормализацию токенов на основе набора правил. По умолчанию фильтр использует следующие правила:

  • Разделяет токены по неалфавитно-цифровым символам. Фильтр использует эти символы в качестве разделителей. Например: Super-Duper → Super, Duper
  • Удаляет ведущие или хвостовые разделители из каждого токена. Например: XL---42+'Autocoder' → XL, 42, Autocoder
  • Разделяет токены при переходе к другому регистру. Например: PowerShot → Power, Shot
  • Разделяет токены при переходе от буквы к цифре. Например: XL500 → XL, 500
  • Удаляет английское притяжательное ('s) из конца каждого токена. Например: Neil's → Neil

Фильтр word_delimiter_graph использует Lucene’s WordDelimiterGraphFilter.

Фильтр word_delimiter_graph был разработан для удаления знаков препинания из сложных идентификаторов, таких как идентификаторы продуктов или номеров деталей. Для этих случаев рекомендуется использовать фильтр word_delimiter_graph с keyword токенизатором.

Избегайте использования фильтра word_delimiter_graph для разделения слов, соединённых дефисами, таких как wi-fi. Поскольку пользователи часто ищут эти слова как с дефисом, так и без него, рекомендуется использовать synonym_graph фильтр вместо него.

Пример

Следующий запрос API анализа использует фильтр word_delimiter_graph для разделения Neil's-Super-Duper-XL500--42+AutoCoder на нормализованные токены, используя стандартные правила фильтра:

GET /_analyze
{
  "tokenizer": "keyword",
  "filter": [ "word_delimiter_graph" ],
  "text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}

Фильтр производит следующие токены:

[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]

Добавление в анализатор

Следующий запрос API создания индекса использует фильтр word_delimiter_graph для настройки нового пользовательского анализатора.

PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "word_delimiter_graph" ]
        }
      }
    }
  }
}

Избегайте использования фильтра word_delimiter_graph с токенизаторами, которые удаляют знаки препинания, например standard токенизатором. Это может помешать фильтру word_delimiter_graph правильно разделять токены. Это также может повлиять на настраиваемые параметры фильтра, такие как catenate_all или preserve_original. Вместо этого рекомендуется использовать keyword или whitespace токенизаторы.

Настраиваемые параметры

adjust_offsets

(Необязательно, Булево) Если true, фильтр корректирует смещения разделенных или склеенных токенов, чтобы лучше отразить их фактическое положение в потоке токенов. По умолчанию true.

Установите adjust_offsets в false, если ваш анализатор использует фильтры, такие как фильтр trim, которые изменяют длину токенов, не изменяя их смещения. В противном случае, фильтр word_delimiter_graph может создавать токены с некорректными смещениями.

catenate_all

(Необязательно, Булево) Если true, фильтр создаёт склеенные токены для цепочек буквенно-цифровых символов, разделённых небуквенно-цифровыми разделителями. Например: super-duper-xl-500 → [ superduperxl500, super, duper, xl, 500 ]. По умолчанию false.

Установка этого параметра в true создаёт токены с несколькими позициями, которые не поддерживаются индексированием.

Если этот параметр true, избегайте использования этого фильтра в индексном анализаторе или используйте фильтр flatten_graph после этого фильтра, чтобы сделать поток токенов подходящим для индексирования.

При использовании для анализа поиска, склеенные токены могут вызвать проблемы для запроса match_phrase и других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в true, если вы планируете использовать эти запросы.

catenate_numbers

(Необязательно, Булево) Если true, фильтр создаёт склеенные токены для цепочек цифровых символов, разделённых небуквенно-цифровыми разделителями. Например: 01-02-03 → [ 010203, 01, 02, 03 ]. По умолчанию false.

Установка этого параметра в true создаёт токены с несколькими позициями, которые не поддерживаются индексированием.

Если этот параметр true, избегайте использования этого фильтра в индексном анализаторе или используйте фильтр flatten_graph после этого фильтра, чтобы сделать поток токенов подходящим для индексирования.

При использовании для анализа поиска, склеенные токены могут вызвать проблемы для запроса match_phrase и других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в true, если вы планируете использовать эти запросы.

catenate_words

(Необязательно, Булево) Если true, фильтр создаёт склеенные токены для цепочек буквенных символов, разделённых небуквенно-цифровыми разделителями. Например: super-duper-xl → [ superduperxl, super, duper, xl ]. По умолчанию false.

Установка этого параметра в true создаёт токены с несколькими позициями, которые не поддерживаются индексированием.

Если этот параметр true, избегайте использования этого фильтра в индексном анализаторе или используйте фильтр flatten_graph после этого фильтра, чтобы сделать поток токенов подходящим для индексирования.

При использовании для анализа поиска, склеенные токены могут вызвать проблемы для запроса match_phrase и других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в true, если вы планируете использовать эти запросы.

generate_number_parts
(Необязательно, Булево) Если true, фильтр включает токены, состоящие только из цифровых символов, в выходные данные. Если false, фильтр исключает эти токены из выходных данных. По умолчанию true.
generate_word_parts
(Необязательно, Булево) Если true, фильтр включает токены, состоящие только из буквенных символов, в выходные данные. Если false, фильтр исключает эти токены из выходных данных. По умолчанию true.
ignore_keywords
(Необязательно, Булево) Если true, фильтр пропускает токены с атрибутом keyword равным true. По умолчанию false.
preserve_original

(Необязательно, Булево) Если true, фильтр включает исходную версию любых разделенных токенов в выходные данные. Эта исходная версия включает не буквенно-цифровые разделители. Например: super-duper-xl-500 → [ super-duper-xl-500, super, duper, xl, 500 ]. По умолчанию false.

Установка этого параметра в true создаёт токены с несколькими позициями, которые не поддерживаются индексированием.

Если этот параметр true, избегайте использования этого фильтра в индексном анализаторе или используйте фильтр flatten_graph после этого фильтра, чтобы сделать поток токенов подходящим для индексирования.

protected_words
(Необязательно, массив строк) Массив токенов, которые фильтр не будет разделять.
protected_words_path

(Необязательно, строка) Путь к файлу, содержащему список токенов, которые фильтр не будет разделять.

Этот путь должен быть абсолютным или относительным к местоположению config, а файл должен быть закодирован в UTF-8. Каждый токен в файле должен быть разделен символом перевода строки.

split_on_case_change
(Необязательно, Булево) Если true, фильтр разделяет токены при переходе между прописными и строчными буквами. Например: camelCase → [ camel, Case ]. По умолчанию true.
split_on_numerics
(Необязательно, Булево) Если true, фильтр разделяет токены при переходе между буквами и цифрами. Например: j2se → [ j, 2, se ]. По умолчанию true.
stem_english_possessive
(Необязательно, Булево) Если true, фильтр удаляет английский притяжательный падеж ('s) с конца каждого токена. Например: O'Neil's → [ O, Neil ]. По умолчанию true.
type_table

(Необязательно, массив строк) Массив пользовательских сопоставлений типов для символов. Это позволяет сопоставить не буквенно-цифровые символы как цифровые или буквенно-цифровые, чтобы избежать разделения на эти символы.

Например, следующий массив сопоставляет символы плюс (+) и минус (-) как буквенно-цифровые, что означает, что они не будут рассматриваться как разделители:

[ "+ => ALPHA", "- => ALPHA" ]

Поддерживаемые типы включают:

  • ALPHA (Буквенный)
  • ALPHANUM (Буквенно-цифровой)
  • DIGIT (Цифровой)
  • LOWER (Строчные буквы)
  • SUBWORD_DELIM (Разделитель не буквенно-цифровой)
  • UPPER (Прописные буквы)
type_table_path

(Необязательно, строка) Путь к файлу, содержащему пользовательские сопоставления типов для символов. Например, содержимое этого файла может содержать следующее:

# Map the $, %, '.', and ',' characters to DIGIT
# This might be useful for financial data.
$ => DIGIT
% => DIGIT
. => DIGIT
\\u002C => DIGIT

# in some cases you might not want to split on ZWJ
# this also tests the case where we need a bigger byte[]
# see https://en.wikipedia.org/wiki/Zero-width_joiner
\\u200D => ALPHANUM

Поддерживаемые типы включают:

  • ALPHA (Буквенный)
  • ALPHANUM (Буквенно-цифровой)
  • DIGIT (Цифровой)
  • LOWER (Строчные буквы)
  • SUBWORD_DELIM (Разделитель не буквенно-цифровой)
  • UPPER (Прописные буквы)

Этот путь к файлу должен быть абсолютным или относительным к местоположению config, и файл должен быть закодирован в UTF-8. Каждое сопоставление в файле должно быть разделено символом перевода строки.

Настройка

Для настройки фильтра word_delimiter_graph, дублируйте его, чтобы создать основу для нового пользовательского фильтра токенов. Вы можете изменить фильтр, используя его настраиваемые параметры.

Например, следующий запрос создает фильтр word_delimiter_graph, который использует следующие правила:

  • Разделять токены на небуквенно-цифровые символы, кроме символа тире (-).
  • Удалять начальные или конечные разделители из каждого токена.
  • Не разделять токены на переходы между регистрами букв.
  • Не разделять токены на переходы между буквами и цифрами.
  • Удалять английский притяжательный падеж ('s) из конца каждого токена.
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "my_custom_word_delimiter_graph_filter" ]
        }
      },
      "filter": {
        "my_custom_word_delimiter_graph_filter": {
          "type": "word_delimiter_graph",
          "type_table": [ "- => ALPHA" ],
          "split_on_case_change": false,
          "split_on_numerics": false,
          "stem_english_possessive": true
        }
      }
    }
  }
}

Различия между word_delimiter_graph и word_delimiter

Оба фильтра word_delimiter_graph и word_delimiter генерируют токены, охватывающие несколько позиций, когда любые из следующих параметров заданы true:

  • catenate_all
  • catenate_numbers
  • catenate_words
  • preserve_original

Однако, только фильтр word_delimiter_graph назначает токенам, охватывающим несколько позиций, атрибут positionLength, который указывает количество позиций, охватываемых токеном. Это гарантирует, что фильтр word_delimiter_graph всегда генерирует корректные графы токенов.

Фильтр word_delimiter не назначает токенам, охватывающим несколько позиций, атрибут positionLength. Это означает, что он генерирует некорректные графы для потоков, включающих эти токены.

Хотя индексация не поддерживает графы токенов, содержащие токены, охватывающие несколько позиций, запросы, такие как запрос match_phrase, могут использовать эти графы для генерации нескольких подзапросов из одной строки запроса.

Чтобы увидеть, как отличаются графы токенов, созданные фильтрами word_delimiter и word_delimiter_graph, рассмотрите следующий пример.

Пример

Базовый граф токенов

И word_delimiter, и word_delimiter_graph создают следующий граф токенов для PowerShot2000, когда указаны следующие параметры false:

  • catenate_all
  • catenate_numbers
  • catenate_words
  • preserve_original

Этот граф не содержит токенов, охватывающих несколько позиций. Все токены охватывают только одну позицию.

token graph basic

Граф word_delimiter_graph с токеном, охватывающим несколько позиций

Фильтр word_delimiter_graph генерирует следующий граф токенов для PowerShot2000, когда catenate_words задан как true.

Этот граф правильно указывает, что токен PowerShot, образованный конкатенацией, охватывает две позиции.

token graph wdg

Граф word_delimiter с токеном, охватывающим несколько позиций

Когда catenate_words задан как true, фильтр word_delimiter генерирует следующий граф токенов для PowerShot2000.

Обратите внимание, что токен PowerShot, образованный конкатенацией, должен охватывать две позиции, но в графе токенов он охватывает только одну, что делает его некорректным.

token graph wd

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-word-delimiter-graph-tokenfilter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API