Токенайзер Pattern
Токенайзер pattern использует регулярное выражение для разделения текста на термины при совпадении с разделителем слов или для захвата соответствующего текста в качестве терминов.
По умолчанию используется паттерн \W+, который разделяет текст при встрече небуквенных символов.
Осторожно: патологические регулярные выражения
Токенайзер Pattern использует регулярные выражения Java.
Неправильно написанное регулярное выражение может работать очень медленно или даже вызвать StackOverflowError и привести к внезапному выходу из строя узла.
Узнайте больше о патологических регулярных выражениях и способах их избежания.
Пример вывода
resp = client.indices.analyze(
tokenizer="pattern",
text="The foo_bar_size's default is 5.",
)
print(resp) response = client.indices.analyze(
body: {
tokenizer: 'pattern',
text: "The foo_bar_size's default is 5."
}
)
puts response const response = await client.indices.analyze({
tokenizer: "pattern",
text: "The foo_bar_size's default is 5.",
});
console.log(response); POST _analyze
{
"tokenizer": "pattern",
"text": "The foo_bar_size's default is 5."
} Предложение выше даст следующие термины:
[ The, foo_bar_size, s, default, is, 5 ]
Настройка
Токенайзер pattern принимает следующие параметры:
| | Регулярное выражение Java, по умолчанию |
| | Флаги регулярного выражения Java flags. Флаги должны быть разделены символом «|», например |
| | Какую группу захвата извлечь в качестве токенов. По умолчанию |
Пример конфигурации
В этом примере мы настраиваем токенайзер pattern для разделения текста по запятым:
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": ","
}
}
}
},
)
print(resp)
resp1 = client.indices.analyze(
index="my-index-000001",
analyzer="my_analyzer",
text="comma,separated,values",
)
print(resp1) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'my_tokenizer'
}
},
tokenizer: {
my_tokenizer: {
type: 'pattern',
pattern: ','
}
}
}
}
}
)
puts response
response = client.indices.analyze(
index: 'my-index-000001',
body: {
analyzer: 'my_analyzer',
text: 'comma,separated,values'
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "my_tokenizer",
},
},
tokenizer: {
my_tokenizer: {
type: "pattern",
pattern: ",",
},
},
},
},
});
console.log(response);
const response1 = await client.indices.analyze({
index: "my-index-000001",
analyzer: "my_analyzer",
text: "comma,separated,values",
});
console.log(response1); PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": ","
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_analyzer",
"text": "comma,separated,values"
} Этот пример создает следующие термины:
[ comma, separated, values ]
В следующем примере мы настраиваем токенайзер pattern для захвата значений в двойных кавычках (игнорируя вложенные экранированные кавычки \"). Само регулярное выражение выглядит так:
"((?:\\"|[^"]|\\")*)"
И читается следующим образом:
- Буквальный
" -
Начать захват:
- Буквальный
\"или любой символ, кроме" - Повторять до тех пор, пока не найдутся все совпадения
- Буквальный
- Буквальная закрывающая
"
Когда шаблон задаётся в JSON, символы " и \ нужно экранировать, поэтому шаблон в итоге выглядит так:
\"((?:\\\\\"|[^\"]|\\\\\")+)\"
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
"group": 1
}
}
}
},
)
print(resp)
resp1 = client.indices.analyze(
index="my-index-000001",
analyzer="my_analyzer",
text="\"value\", \"value with embedded \\\" quote\"",
)
print(resp1) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'my_tokenizer'
}
},
tokenizer: {
my_tokenizer: {
type: 'pattern',
pattern: '"((?:\\\"|[^"]|\\\")+)"',
group: 1
}
}
}
}
}
)
puts response
response = client.indices.analyze(
index: 'my-index-000001',
body: {
analyzer: 'my_analyzer',
text: '"value", "value with embedded \" quote"'
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: "my_tokenizer",
},
},
tokenizer: {
my_tokenizer: {
type: "pattern",
pattern: '"((?:\\\\"|[^"]|\\\\")+)"',
group: 1,
},
},
},
},
});
console.log(response);
const response1 = await client.indices.analyze({
index: "my-index-000001",
analyzer: "my_analyzer",
text: '"value", "value with embedded \\" quote"',
});
console.log(response1); PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "pattern",
"pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
"group": 1
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_analyzer",
"text": "\"value\", \"value with embedded \\\" quote\""
} Этот пример создаёт следующие два термина:
[ value, value with embedded \" quote ]
© 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-pattern-tokenizer.html