Elasticsearch - поиск подстроки, охватывающей 2 слова - PullRequest
2 голосов
/ 05 июля 2019

Простой пример

У меня есть документ с текстовым полем name, который обычно содержит адреса:

1234 Palm Tree Street NE, Miami, FL 33101

Я ожидаю, что Elasticsearch найдет Palm Tree по указанному выше адресу, когда я использую wildcard с:

*alm Tre*

Вместо этого я не получаю результатов.

Обоснование / реалистичный пример

Иногда поле name содержит закодированную информацию, которая охватывает 2 слова, следующим образом:

R3358b7119 x3387HRL388

Я использую подстановочный знак с *<search phrase>*, который работает, когда пользователь вводит либо 2 целых слова, либо одно частичное слово. Но если пользователь вводит конец одного слова и начало следующего слова, например b7119 x3387 (используя приведенный выше пример), документ не возвращается.

Регулярное выражение не представляется возможным решением: (

Я пытался использовать поиск по регулярному выражению:

{'regexp': {'name': '.*b7119 x3387.*'}}

Но даже это не вернуло документ.

Я действительно в растерянности ...

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Прежде всего, чтобы регулярное выражение работало, вам нужно установить сопоставление для вашего name с помощью not_analyzed, потому что Elasticsearch будет применять регулярное выражение к условиям, производимым токенизатором для этого поля, и не к исходному тексту поля

"type": {
   "properties": {
      "name": {
         "type": "string",
         "index": "not_analyzed",
         "store": true
      }
   }
}
1 голос
/ 06 июля 2019

Если вы еще не знаете, регулярное выражение с .* требует больших вычислительных затрат. Более гибким решением будет использование анализаторов для решения вашей проблемы.

Вы можете создать поле без пробелов и использовать ngram analyzer , чтобы разбить ваш текст на под токены. Это решение должно быть намного быстрее, но для хранения всех подмножеств потребуется гораздо больше дискового пространства.

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