#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. Вам необходимо создать индекс с пользовательскими настройками для того же.