Фильтр токенов word delimiter
Рекомендуется использовать word_delimiter_graph вместо фильтра word_delimiter.
Фильтр word_delimiter может генерировать некорректные графики токенов. См. Различия между word_delimiter_graph и word_delimiter.
Фильтр word_delimiter также использует устаревший WordDelimiterFilter из Lucene.
Разделяет токены на основе небуквенно-цифровых символов. Фильтр word_delimiter также выполняет необязательную нормализацию токенов на основе набора правил. По умолчанию фильтр использует следующие правила:
- Разделяет токены на небуквенно-цифровые символы. Фильтр использует эти символы в качестве разделителей. Например:
Super-Duper→Super,Duper - Удаляет ведущие и хвостовые разделители из каждого токена. Например:
XL---42+'Autocoder'→XL,42,Autocoder - Разделяет токены при переходе между регистрами букв. Например:
PowerShot→Power,Shot - Разделяет токены при переходе между буквами и цифрами. Например:
XL500→XL,500 - Удаляет английский суффикс притяжательности (
's) из конца каждого токена. Например:Neil's→Neil
Фильтр word_delimiter был разработан для удаления пунктуации из сложных идентификаторов, таких как идентификаторы продуктов или номеров деталей. В этих случаях рекомендуется использовать фильтр word_delimiter с токенайзером keyword.
Избегайте использования фильтра word_delimiter для разделения слов с дефисами, таких как wi-fi. Поскольку пользователи часто ищут такие слова как с дефисом, так и без него, рекомендуется использовать вместо него фильтр synonym_graph.
Пример
В следующем запросе API анализировать используется фильтр word_delimiter для разделения Neil's-Super-Duper-XL500--42+AutoCoder на нормализованные токены с использованием правил фильтра по умолчанию:
resp = client.indices.analyze(
tokenizer="keyword",
filter=[
"word_delimiter"
],
text="Neil's-Super-Duper-XL500--42+AutoCoder",
)
print(resp) response = client.indices.analyze(
body: {
tokenizer: 'keyword',
filter: [
'word_delimiter'
],
text: "Neil's-Super-Duper-XL500--42+AutoCoder"
}
)
puts response const response = await client.indices.analyze({
tokenizer: "keyword",
filter: ["word_delimiter"],
text: "Neil's-Super-Duper-XL500--42+AutoCoder",
});
console.log(response); GET /_analyze
{
"tokenizer": "keyword",
"filter": [ "word_delimiter" ],
"text": "Neil's-Super-Duper-XL500--42+AutoCoder"
} Фильтр генерирует следующие токены:
[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]
Добавление в анализатор
В следующем запросе API создания индекса используется фильтр word_delimiter для настройки нового пользовательского анализатора.
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"word_delimiter"
]
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'keyword',
filter: [
'word_delimiter'
]
}
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "keyword",
filter: ["word_delimiter"],
},
},
},
},
});
console.log(response); PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "word_delimiter" ]
}
}
}
}
} Избегайте использования фильтра word_delimiter с токенайзерами, удаляющими знаки препинания, такими как standard токенайзер. Это может помешать фильтру word_delimiter корректно разделять токены. Также это может повлиять на настраиваемые параметры фильтра, такие как catenate_all или preserve_original. Рекомендуется использовать токенайзер keyword или whitespace вместо него.
Настраиваемые параметры
-
catenate_all -
(Необязательно, логическое значение) Если
true, фильтр создаёт конкатенированные токены для цепочек буквенно-цифровых символов, разделённых небуквенно-цифровыми разделителями. Например:super-duper-xl-500→ [super,superduperxl500,duper,xl,500]. По умолчанию установлено значениеfalse.При использовании для анализа поиска конкатенированные токены могут вызвать проблемы для запроса
match_phraseи других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в значениеtrue, если вы планируете использовать эти запросы. -
catenate_numbers -
(Необязательно, логическое значение) Если
true, фильтр создаёт конкатенированные токены для цепочек числовых символов, разделённых небуквенно-цифровыми разделителями. Например:01-02-03→ [01,010203,02,03]. По умолчанию установлено значениеfalse.При использовании для анализа поиска конкатенированные токены могут вызвать проблемы для запроса
match_phraseи других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в значениеtrue, если вы планируете использовать эти запросы. -
catenate_words -
(Необязательно, логическое значение) Если
true, фильтр создаёт конкатенированные токены для цепочек буквенных символов, разделённых небуквенно-цифровыми разделителями. Например:super-duper-xl→ [super,superduperxl,duper,xl]. По умолчанию установлено значениеfalse.При использовании для анализа поиска конкатенированные токены могут вызвать проблемы для запроса
match_phraseи других запросов, которые полагаются на позицию токенов для сопоставления. Избегайте установки этого параметра в значениеtrue, если вы планируете использовать эти запросы. -
generate_number_parts - (Необязательно, логическое значение) Если
true, фильтр включает в выходные данные токены, состоящие только из числовых символов. Еслиfalse, фильтр исключает эти токены из выходных данных. По умолчанию установлено значениеtrue. -
generate_word_parts - (Необязательно, логическое значение) Если
true, фильтр включает в выходные данные токены, состоящие только из буквенных символов. Еслиfalse, фильтр исключает эти токены из выходных данных. По умолчанию установлено значениеtrue. -
preserve_original - (Необязательно, логическое значение) Если
true, фильтр включает исходную версию любого разделенного токена в выходных данных. Эта исходная версия включает небуквенно-цифровые разделители. Например:super-duper-xl-500→ [super-duper-xl-500,super,duper,xl,500]. По умолчанию установлено значениеfalse. -
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, дублируйте его, чтобы создать основу для нового пользовательского фильтра. Вы можете изменить фильтр, используя его настраиваемые параметры.
Например, следующий запрос создаёт фильтр word_delimiter, который использует следующие правила:
- Разделять токены на небуквенно-цифровые символы, за исключением символа тире (
-). - Удалять ведущие или хвостовые разделители из каждого токена.
- Не разделять токены на границах изменения регистра.
- Не разделять токены на границах перехода буква-цифра.
- Удалять английский притяжательный суффикс (
's) из конца каждого токена.
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [
"my_custom_word_delimiter_filter"
]
}
},
"filter": {
"my_custom_word_delimiter_filter": {
"type": "word_delimiter",
"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_filter'
]
}
},
filter: {
my_custom_word_delimiter_filter: {
type: 'word_delimiter',
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_filter"],
},
},
filter: {
my_custom_word_delimiter_filter: {
type: "word_delimiter",
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_filter" ]
}
},
"filter": {
"my_custom_word_delimiter_filter": {
"type": "word_delimiter",
"type_table": [ "- => ALPHA" ],
"split_on_case_change": false,
"split_on_numerics": false,
"stem_english_possessive": true
}
}
}
}
}
© 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-tokenfilter.html