Я нашел решение месяц назад, но забыл опубликовать его здесь.У меня нет под рукой примера, но я попытаюсь объяснить его.
Проблема заключалась в том, что поля, которые я пытался запросить, были проанализированы с помощьювалайзера поиска до запроса.Рассматриваемый анализатор делил их на пробелы и т. Д. Решение этой проблемы является одним из двух:
1. Если вы не используете настраиваемое сопоставление для индекса.
(Имеется в виду, если вы позволили эластичному поиску динамически создавать соответствующее отображение для вашего поля при его добавлении).
В этом случае эластичный поиск автоматически создает подполе текстового поля, которое называется «ключевое слово».В этом подполе используется анализатор ключевых слов, который не обрабатывает данные до запроса.
Это означает, что такие запросы, как:
{
"query": {
"bool": {
"must": [ // must_not
{
"match": {
"user.keyword": "Kim Chy"
}
}
]
}
}
} и
{
"query": {
"bool": {
"must": [ // must_not
{
"wildcard": {
"user.keyword": "Kim*y"
}
}
]
}
}
}
должны работать как положено.
Однако при сопоставлении по умолчанию поле ключевого слова, скорее всего, будет чувствительным к регистру.Для того, чтобы он также не учитывал регистр, вам необходимо создать собственное отображение, которое применяет строчные (или прописные) normalizer к полю запроса и ключевого слова перед сопоставлением.
2.Если вы используете настраиваемое сопоставление
По сути то же самое, что и выше, однако вам придется создать новое подполе (или поле) вручную, которое использует анализатор ключевых слов (и, возможно, нормализатор, чтобы онбыть нечувствительным к регистру).
PS Насколько я знаю, изменение отображения больше невозможно в эластичном поиске.Это означает, что вам придется создать новый индекс с соответствующим отображением, а затем переиндексировать данные в новый индекс.