После того, как я добавил анализатор синонимов в my_index, индекс стал чувствительным к регистру.
У меня есть одно свойство под названием nationality, которое имеет synonym analyzer. Но кажется, что это свойство стало case sensitive из-за анализатора синонимов.
Вот мой /my_index/_mappings
{
"my_index": {
"mappings": {
"items": {
"properties": {
.
.
.
"nationality": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "synonym"
},
.
.
.
}
}
}
}
}
Внутри индекса у меня есть слово India COUNTRY. Когда я попытаюсь найти India nation с помощью приведенной ниже команды, я получу результат.
POST /my_index/_search
{
"query": {
"match": {
"nationality": "India nation"
}
}
}
Но когда я ищу india (обратите внимание, что буква i в нижнем регистре), я ничего не получу.
Я предполагаю, что это произошло потому, что я поставил фильтр uppercase перед synonym. Я сделал это, потому что синонимы в верхнем регистре. Таким образом, после прохождения этого фильтра запрос India будет INDIA.
Вот мой /my_index/_settings
{
"my_index": {
"settings": {
"index": {
"number_of_shards": "1",
"provided_name": "my_index",
"similarity": {
"default": {
"type": "BM25",
"b": "0.9",
"k1": "1.8"
}
},
"creation_date": "1647924292297",
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"lenient": "true",
"synonyms": [
"NATION, COUNTRY, FLAG"
]
}
},
"analyzer": {
"synonym": {
"filter": [
"uppercase",
"synonym"
],
"tokenizer": "whitespace"
}
}
},
"number_of_replicas": "1",
"version": {
"created": "6080099"
}
}
}
}
}
Есть ли способ сделать это свойство нечувствительным к регистру? Все решения, которые я нашел, показывают только то, что я должен либо установить весь текст внутри nationality в строчные, либо в прописные буквы. Но что, если у меня есть прописные и строчные буквы внутри индекса?
Применяли ли вы фильтр синонимов после добавления ваших данных в индекс?
Если так, возможно, фраза "Страна Индии" была проиндексирована точно так же, как "СТРАНА Индии". Когда вы отправили запрос на сопоставление в индекс, ваш запрос был проанализирован и отправлен как «СТРАНА ИНДИИ», потому что у вас больше нет фильтра верхнего регистра, он сопоставляется, потому что вы используете запрос на сопоставление, достаточно совпадения одного из слов. Слово "СТРАНА" обеспечивает это.
Но когда вы отправляете однословный запрос «Индия», он анализируется и преобразуется в «ИНДИЯ» из-за вашего фильтра верхнего регистра, но в вашем индексе нет подходящего слова. У вас просто в документе есть "Индия СТРАНА".
В моем ответе есть небольшое предположение. Я надеюсь, что это будет полезно для понимания вашей проблемы.
Я уже пытался указать на вашу проблему первым предложением. Сначала вам нужно создать сопоставление, включающее фильтр, анализатор и т. д., Затем вы поместите свои данные в индекс. Таким образом, и ваши данные, и запрос будут проанализированы с одинаковым подходом.
А, понятно, спасибо. Я не осознавал, что это влияет на данные внутри индекса. Спасибо
Я нашел решение!
Я не осознавал, что фильтр, который я применил в settings, применим при обновлении и поиске данных. Сначала я сделал этот шаг:
uppercase перед фильтром синонимовПри этом фильтр uppercase не применяется к моим данным. Что я должен был сделать:
uppercase и synonym (обратите внимание на порядок)
Да, я также предполагаю, что это происходит здесь. Поэтому я думаю, что другой подход - установить все документы в моем индексе в верхнем регистре. Но у вас есть другое решение для этого? Спасибо