Как искать запрос по полю с точным соответствием в Elasticsearch - PullRequest
1 голос
/ 01 марта 2020

Я пытаюсь найти документ по значению поля. Поле имеет тип String, который был определен в индексе следующим образом:

"field" : { 
        "type" : "string"
 }

Нет других параметров индекса, кроме сопоставлений.

Я пытался найти несколько запросов, чтобы найти документы с field="test", и каждый раз, когда я не получаю результатов или результатов, содержащих эту подстроку "test". Я хочу документ, в котором "field" точно соответствует "test".

Я пытался match, match_phrase, term и query_string, но ни один из них не работает так, как я хочу.

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Похоже, что вы используете Elasticsearch до версии 6, которая все еще поддерживала тип String. Более поздняя версия Elasticsearch заменила тип поля string типами keyword и text, чтобы упростить поддержку двух вариантов использования exact-match и full-text вариантов использования поиска.

Вам нужно изменить свое отображение для поддержки поиска с точным соответствием следующим образом:

{
  "field": {
    "type" "string",
    "index": "not_analyzed"
  }
}

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

Если вы используете Elasticsearch версии 6+, просто используйте поле типа keyword для поиска с точным соответствием. По умолчанию строковые поля отображаются в мультиполе, состоящее из 2 полей:

  • одного типа text (для полнотекстового поиска), на которое ссылается
  • одно из введите keyword (для точного поиска совпадения), на который ссылается .keyword

Настоящим интересным постом в блоге об этом топи c: Строки мертвы, да здравствуют строки!

1 голос
/ 01 марта 2020

Вам нужно использовать term запрос с таким ключевым словом, как это

{
   "query" : {
      "term" : {
         "field.keyword" : "test"
      }
   }
}

надеюсь, это поможет.

...