Точный поиск совпадений в текстовом поле - PullRequest
0 голосов
/ 24 мая 2019

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

_mapping

"direction": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}

Elastic Data

[
  {
   direction: "North"
  },
  {
   direction: "North East"
  }
]

Запрос

{
  match: {
    "direction" : {
      query: "North",
      operator : "and"
    }
  }
}

Результат

[
  {
   direction: "North"
  },
  {
   direction: "North East"
  }
]

Ожидаемый результат

[
  {
   direction: "North"
  }
]

Отмечено: должно выводиться точное направление совпадения

Ответы [ 3 ]

1 голос
/ 24 мая 2019

Исходя из вашего отображения, вы должны искать не по полю direction, а по direction.keyword, если хотите получить точное совпадение.Поле direction имеет тип text и анализируется - в вашем случае слова north и east.

1 голос
/ 24 мая 2019

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

POST <your_index_name>/_search
{
    "query": {
        "term": {
            "direction.keyword": {
                "value": "North"
            }
        }
    }
}

Причина, по которой вынаблюдайте за тем, что вы наблюдаете, потому что вы запрашиваете в поле Text, используя Match Query.Значения текстового поля разбиваются на токены, которые затем сохраняются в инвертированных индексах.Этот процесс называется Analysis. Текстовые поля не предназначены для точного соответствия.

Также обратите внимание, что любые слова / токены, которые вы упомянули в Match Query, также будутчерез фазу анализа перед выполнением.

Надеюсь, это поможет!

0 голосов
/ 24 мая 2019

Попробуйте это {"query": {"bool": {"must": {"term": {"direction": "North"}}}}}

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