обработка как точного, так и частичного поиска в одной строке поиска - PullRequest
0 голосов
/ 09 февраля 2019

Я хочу определить схему, которая может охватывать как частичный, так и точный поиск того же поискового значения.

Точный поиск всегда должен возвращать «точное совпадение», в этом случае ES не должен разбивать строку поиска на токены.

1 Ответ

0 голосов
/ 09 февраля 2019

Для частичного совпадения тип данных свойства должен быть text, а для точного - keyword.Для обеспечения возможности частичного и точного поиска без индексации данных для различных свойств вы можете использовать fields.Что он делает, так это то, что он помогает индексировать одни и те же данные разными способами.

Итак, допустим, вы хотите проиндексировать имена людей и иметь возможность частичного и точного поиска.В таком случае отображение будет:

PUT test
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

Позволяет индексировать несколько документов:

PUT test/_doc/1
{
  "name": "Nishant Saini"
}

PUT test/_doc/2
{
  "name": "Nishant Kumar"
}

Для частичного поиска нам нужно запросить поле name, и оно имеет тип text.

GET test/_doc/_search
{
  "query": {
    "query_string": {
      "query": "Nishant Saini",
      "field": [
        "name"
      ]
    }
  }
}

Приведенный выше запрос вернет оба документа (1 и 2), поскольку в обоих документах для одного поля появляется Nishant для поля name.

Для точного поисканам нужно запросить name.keyword.Для точного соответствия мы можем использовать термин запроса, как показано ниже:

{
  "query": {
    "term": {
      "name.keyword": "Nishant Saini"
    }
  }
}

Это будет соответствовать только документу 1.

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