Elasticsearch соответствует содержанию фразы с пробелами - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужен поиск, где должен быть поиск, если в нем содержится ключевая фраза, но ключевая фраза может иметь пробел, и должна быть целая фраза.

Как я понимаю, index_analyzer и searh_analyzer могут либо разделяться пробелами, либо нет, давая четыре возможности - ни одна из которых, кажется, не делает то, что мне нужно.

В качестве примера, скажем, ключевая фраза "один к". Это означает, что я хотел бы, чтобы поиск с «один два» или «один два три» соответствовал, но не один с «одним». Учитывая разные варианты:

  1. Разделение как по индексу, так и по поиску -> не работает, потому что "one" будет соответствовать
  2. Разделение по индексу, но не по поиску -> не работает, потому что «один два» не будет соответствовать
  3. Не разбивать на индексы, разбивать на поиске -> не работает, потому что «один два» не будет совпадать
  4. Не разделять ни по индексу, ни по поиску -> не работает, потому что "один два три" не будет соответствовать

1 Ответ

0 голосов
/ 14 сентября 2018

Одним из возможных решений может быть создание нового сопоставления для этого поля с типом ключевое слово , тогда оно не будет проанализировано ElasticSearch и будет сохранено "как есть" (на самом деле вы можете запустить нормализатор против него, если вам нужно каким-то образом его обработать / изменить). Тогда вам не нужно иметь дело с анализаторами.

Допустим, у вас есть поле с именем description, тогда отображение может выглядеть так:

{
  ...
  "description": {
    "type": "text", // assuming you originally have it as text
    "fields": {
      "original": "keyword",
      "ignore_above": 512 // You can skip or change it and ES applies default value. 
    }
  }

Приведенный выше код означает, что ElasticSearch будет хранить две версии сообщения - проанализированную по умолчанию и новую, которая не анализируется. Затем вы можете получить к нему доступ со следующим именем: description.original и использовать, например, поиск по шаблону.

...