Создание пользовательского анализатора
Когда встроенных анализаторов недостаточно, можно создать собственный анализатор, который использует нужное сочетание:
- ноль или более фильтров символов
- токенизатор
- ноль или более фильтров токенов.
Настройка
Анализатор принимает следующие параметры:
| | Тип анализатора. Принимает типы встроенных анализаторов. Для пользовательских анализаторов используйте |
| | Встроенный или настраиваемый токенизатор. (Обязательно) |
| | Необязательный массив встроенных или настраиваемых фильтров символов. |
| | Необязательный массив встроенных или настраиваемых фильтров токенов. |
| | При индексировании массива текстовых значений Elasticsearch вставляет фиктивный "разрыв" между последним термином одного значения и первым термином следующего, чтобы убедиться, что запрос по фразе не совпадает с двумя терминами из разных элементов массива. По умолчанию значение |
Пример конфигурации
В этом примере сочетаются следующие элементы:
- Фильтр символов
- Токенизатор
- Фильтры токенов
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
)
print(resp)
resp1 = client.indices.analyze(
index="my-index-000001",
analyzer="my_custom_analyzer",
text="Is this déjà vu</b>?",
)
print(resp1) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_custom_analyzer: {
type: 'custom',
tokenizer: 'standard',
char_filter: [
'html_strip'
],
filter: [
'lowercase',
'asciifolding'
]
}
}
}
}
}
)
puts response
response = client.indices.analyze(
index: 'my-index-000001',
body: {
analyzer: 'my_custom_analyzer',
text: 'Is this déjà vu</b>?'
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_custom_analyzer: {
type: "custom",
tokenizer: "standard",
char_filter: ["html_strip"],
filter: ["lowercase", "asciifolding"],
},
},
},
},
});
console.log(response);
const response1 = await client.indices.analyze({
index: "my-index-000001",
analyzer: "my_custom_analyzer",
text: "Is this déjà vu</b>?",
});
console.log(response1); PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>déjà vu</b>?"
} | Для |
В приведенном выше примере получаются следующие термины:
[ is, this, deja, vu ]
В предыдущем примере использовались токенизатор, фильтры токенов и фильтры символов с их значениями по умолчанию, но можно создать настроенные версии каждого из них и использовать их в пользовательском анализаторе.
Вот более сложный пример, сочетающий следующие элементы:
- Фильтр символов
-
- Фильтр символов Mapping, настроенный на замену
:)на_happy_и:(на_sad_
- Фильтр символов Mapping, настроенный на замену
- Токенизатор
-
- Токенизатор Pattern, настроенный для разделения по знакам препинания
- Фильтры токенов
-
- Фильтр токенов Lowercase
- Фильтр токенов Stop, настроенный на использование предварительно определенного списка стоп-слов английского языка
Вот пример:
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": {
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
},
)
print(resp)
resp1 = client.indices.analyze(
index="my-index-000001",
analyzer="my_custom_analyzer",
text="I'm a :) person, and you?",
)
print(resp1) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
analyzer: {
my_custom_analyzer: {
char_filter: [
'emoticons'
],
tokenizer: 'punctuation',
filter: [
'lowercase',
'english_stop'
]
}
},
tokenizer: {
punctuation: {
type: 'pattern',
pattern: '[ .,!?]'
}
},
char_filter: {
emoticons: {
type: 'mapping',
mappings: [
':) => _happy_',
':( => _sad_'
]
}
},
filter: {
english_stop: {
type: 'stop',
stopwords: '_english_'
}
}
}
}
}
)
puts response
response = client.indices.analyze(
index: 'my-index-000001',
body: {
analyzer: 'my_custom_analyzer',
text: "I'm a :) person, and you?"
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
analyzer: {
my_custom_analyzer: {
char_filter: ["emoticons"],
tokenizer: "punctuation",
filter: ["lowercase", "english_stop"],
},
},
tokenizer: {
punctuation: {
type: "pattern",
pattern: "[ .,!?]",
},
},
char_filter: {
emoticons: {
type: "mapping",
mappings: [":) => _happy_", ":( => _sad_"],
},
},
filter: {
english_stop: {
type: "stop",
stopwords: "_english_",
},
},
},
},
});
console.log(response);
const response1 = await client.indices.analyze({
index: "my-index-000001",
analyzer: "my_custom_analyzer",
text: "I'm a :) person, and you?",
});
console.log(response1); PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": {
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "I'm a :) person, and you?"
} | Присваивает индексу по умолчанию пользовательский анализатор, | |
| Определяет пользовательский токенизатор | |
| Определяет пользовательский фильтр символов | |
| Определяет пользовательский фильтр токенов |
В приведенном выше примере получаются следующие термины:
[ i'm, _happy_, person, you ]
© 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-custom-analyzer.html