Проблема поиска с подстановочными знаками с длинным типом данных в elasticsearch
{
"from":0,
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"10*",
"lenient":true,
"fields":[
"phoneNumber"
],
"escape":true
}
}
]
}
}
}
Здесь телефонный номер имеет тип long, и мы хотим выполнить для него поиск по шаблону. Я передаю запрос как 10 * ( "query":"10*",
) Фактических совпадений должно быть 15, но я получаю 0 совпадений.
Если я делаю то же самое для поля с типом keyword (string) Address , с запросом "query":"newyork*",
я получаю результат.
Кто-нибудь знает, почему мы не получили хиты для полей с типом long?
Ответы
Невозможно напрямую использовать подстановочные знаки для числовых типов данных. Эти целые числа лучше преобразовать в строки.
Добавление рабочего примера с данными индекса, сопоставлением, поисковым запросом и результатом поиска
Отображение индекса:
{
"mappings": {
"properties": {
"phoneNumber": {
"type": "text"
}
}
}
}
Данные индекса:
{
"phoneNumber": "101"
}
Поисковый запрос:
{
"query": {
"bool": {
"filter": [
{
"query_string": {
"query": "10*",
"fields": [
"phoneNumber"
]
}
}
]
}
}
}
Результат поиска:
"hits": [
{
"_index": "65109764",
"_type": "_doc",
"_id": "1",
"_score": 0.0,
"_source": {
"phoneNumber": "101"
}
}
]
Если вы хотите выполнить частичное совпадение, вы даже можете использовать граничный токенизатор n-грамм