Чтобы обеспечить эффективный запрос, убедитесь, что документы проиндексированы соответствующим образом.
В этом примере, который я только что сделал, я проверяю, чтобы номера телефонов были проиндексированы без дефисов и скобок. Это позволяет мне выполнять запросы без использования этих символов.
Пример:
(1) Создать индекс:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "\\((\\d+)\\)(\\d+)-(\\d+)",
"replacement": "$1$2$3"
}
}
}
}
}
(2 ) Добавить документ в указатель:
POST my_index/doc
{
"Description": "My phone number is (213)234-1111"
}
(3) Запрос с исходным номером телефона:
GET my_index/_search
{
"query": {
"match": {
"Description": "(213)234-1111"
}
}
}
(1 result)
(4) Запрос без специальных символов:
GET my_index/_search
{
"query": {
"match": {
"Description": "2132341111"
}
}
}
(1 result)
Так как же это работало?
Используя фильтр pattern_replace char, мы убираем все, кроме необработанных чисел, что означает, что "(213 ) 234-1111 "фактически сохраняется как" 2132341111 "всякий раз, когда мы сопоставляем номер телефона. Поскольку это pattern_replace также применяется во время запроса, теперь мы можем выполнять поиск как с использованием специальных символов в номере телефона, так и без них, и получить совпадение.