Фильтр символов Pattern replace
Фильтр символов pattern_replace использует регулярное выражение для поиска символов, которые должны быть заменены указанной строкой замены. Строка замены может ссылаться на группы захвата в регулярном выражении.
Осторожно, патологические регулярные выражения
Фильтр символов pattern replace использует регулярные выражения Java.
Плохо написанное регулярное выражение может работать очень медленно или даже выбросить StackOverflowError и привести к внезапному завершению работы узла.
Узнайте больше о патологических регулярных выражениях и как их избежать.
Настройка
Фильтр символов pattern_replace принимает следующие параметры:
| | Регулярное выражение Java. Требуется. |
| | Строка замены, которая может ссылаться на группы захвата, используя синтаксис |
| | Флаги регулярных выражений Java. Флаги должны быть разделены символом "|", например |
Пример конфигурации
В этом примере мы настраиваем фильтр символов pattern_replace для замены вложенных тире в числах на подчеркивания, то есть 123-456-789 → 123_456_789:
PUT my-index-00001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(\\d+)-(?=\\d)",
"replacement": "$1_"
}
}
}
}
}
POST my-index-00001/_analyze
{
"analyzer": "my_analyzer",
"text": "My credit card is 123-456-789"
} Вышеприведенный пример создает следующие термины:
[ My, credit, card, is, 123_456_789 ]
Использование строки замены, которая изменяет длину исходного текста, будет работать для поиска, но приведет к неправильному выделению, как показано в следующем примере.
В этом примере вставляется пробел всякий раз, когда встречается строчная буква, за которой следует заглавная (т.е. fooBarBaz → foo Bar Baz), что позволяет искать слова camelCase по отдельности:
PUT my-index-00001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
],
"filter": [
"lowercase"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
"replacement": " "
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
POST my-index-00001/_analyze
{
"analyzer": "my_analyzer",
"text": "The fooBarBaz method"
} Вышеприведенное возвращает следующие термины:
[ the, foo, bar, baz, method ]
Поиск по bar корректно найдет документ, но выделение результатов будет неправильным, поскольку наш фильтр символов изменил длину исходного текста:
PUT my-index-00001/_doc/1?refresh
{
"text": "The fooBarBaz method"
}
GET my-index-00001/_search
{
"query": {
"match": {
"text": "bar"
}
},
"highlight": {
"fields": {
"text": {}
}
}
} Выходной результат выше:
{
"timed_out": false,
"took": $body.took,
"_shards": {
"total": 1,
"successful": 1,
"skipped" : 0,
"failed": 0
},
"hits": {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "my-index-00001",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"text": "The fooBarBaz method"
},
"highlight": {
"text": [
"The foo<em>Ba</em>rBaz method"
]
}
}
]
}
} | Обратите внимание на неверное выделение. |
© 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-pattern-replace-charfilter.html