Поиск по шаблону в Elasticsearch со строковым полем, содержащим только одно слово - PullRequest
0 голосов
/ 03 марта 2020

У меня есть сценарий использования, в котором поле типа строки в моем индексе имеет одно слово (номер транспортного средства) в качестве значения, и его нужно искать следующим образом: *abc*

Что такое лучший способ добиться этого и как это повлияет на производительность?

В настоящее время я использую следующий запрос: _search?q=vehicleNumber:*119*, который мне кажется крайне неоптимизированным.

1 Ответ

0 голосов
/ 03 марта 2020

Использование лидирующего подстановочного знака может быть довольно дорогим ... Если вы в основном ищете «подстроки» чисел с этим подстановочным знаком, и его формат стандартизирован (представьте номер машины в виде XX-12345-AB), вы можете извлечь просто эти числа в дополнительное поле, а затем выполнить диапазон запросов к нему. Это, безусловно, будет быстрее, чем подстановочные знаки для строк.


Другой вариант - использовать регулярные выражения , что будет полезно, если вы, например, знаете позицию, в которой вы хотите искать , Оказывается, IMEI имеют определенную структуру - AA-BBBBBB-CCCCCC-EE - из вики

Slots

Так что если вы ища совпадение серийного номера, вы переходите к индексу 8:

GET /_search
{
  "query": {
    "regexp": {
      "vehicleNumber": {
        "value": ".{8,}119.*"
      }
    }
  }
}

Подводя итог, regexp и wildcard используйте тот же автомат на заднем плане таким образом, при выполнении запросов leading * выбора между этими двумя показателями нет. Но когда вы знаете позицию, я подозреваю, что regexp может быть более оптимизирован для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...