Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.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 использует WordDelimiterGraphFilter Lucene.

Фильтр 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 на нормализованные токены, используя правила фильтра по умолчанию:

resp = client.indices.analyze(
    tokenizer="keyword",
    filter=[
        "word_delimiter_graph"
    ],
    text="Neil's-Super-Duper-XL500--42+AutoCoder",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'keyword',
    filter: [
      'word_delimiter_graph'
    ],
    text: "Neil's-Super-Duper-XL500--42+AutoCoder"
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "keyword",
  filter: ["word_delimiter_graph"],
  text: "Neil's-Super-Duper-XL500--42+AutoCoder",
});
console.log(response);
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 для настройки нового пользовательского анализатора.

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "word_delimiter_graph"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'keyword',
            filter: [
              'word_delimiter_graph'
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_analyzer: {
          tokenizer: "keyword",
          filter: ["word_delimiter_graph"],
        },
      },
    },
  },
});
console.log(response);
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) из конца каждого токена.
resp = client.indices.create(
    index="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
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    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
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "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,
        },
      },
    },
  },
});
console.log(response);
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/8.17/analysis-word-delimiter-graph-tokenfilter.html

Spec-Zone.ru

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