точные совпадения в elasticsearch (включая пробелы)

#elasticsearch

#elasticsearch

Вопрос:

Я использую ES 6.5, и у меня есть следующие документы

 {"id": 1, "type": "a"}
{"id": 2, "type": "a b"}
 

Сопоставление типов выглядит следующим образом

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

 

Желаемое поведение:

  • когда я запрашиваю по типу a , я хотел бы получить только документ с идентификатором 1
  • когда я запрашиваю по типу a b , я хотел бы получить только документ с идентификатором 2

Что я пробовал:

  • query_string_query: если искомое значение заключено в двойные кавычки, то: если ввод = a , то я получаю оба 1 и 2 ; если ввод = a b , то я получаю только 2
  • запрос термина
  • запрос соответствия

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

Ответ №1:

Вам нужно добавить .ключевое слово в поле type . При этом используется анализатор ключевых слов вместо стандартного анализатора (обратите внимание на «.ключевое слово» после поля типа). Попробуйте следующий запрос —

 {
  "query":{
    "match":{
      "type.keyword":"a b"
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "65327197",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.6931471,
        "_source": {
          "id": 2,
          "type": "a b"
        }
      }
    ]
 

Комментарии:

1. Можете ли вы также дать ma подсказку о том, как сделать его нечувствительным к регистру?

2. @tzortzik для точного соответствия без учета регистра вы можете использовать lowercase нормализатор elasticsearch. Вам необходимо создать индекс с пользовательскими настройками для того же.