Это происходит, когда вы используете поле ключевого слова для индексации company_name
в вашем приложении.
Анализатор ключевых слов - это анализатор «noop», который возвращает всю входную строку как однутокен , например, название компании, состоящее из foo
, Foo
, fOo
будет храниться только с регистром, а поиск foo
будет совпадать только с foo
, поскольку эластичный поиск в конечном итоге работает на совпадении токенов(который чувствителен к регистру).
Вам нужно использовать стандартный анализатор или какой-либо другой пользовательский анализатор , который также решает ваши другие варианты использования и использует строчный фильтр токенов для поля и использование запроса match , который анализируется и использует тот же анализатор, который используется для индексации поля, таким образом, ваш поисковый запрос будет генерировать те же токены, который хранится в индексе, и ваш поиск станет без учета регистра.
Редактировать: Поговорил с пользователем в чате и обновил ответ на sui.t его требования, которые приведены ниже: -
Шаг 1: - Определить параметры и отображение для индекса.
Конечная точка: - http://{{hostname}}:{{port}}/{{index}}
{
"settings": {
"analysis": {
"normalizer": {
"my_normalizer": {
"type": "custom",
"char_filter": [],
"filter": "lowercase"
}
}
}
},
"mappings": {
"properties": {
"company_name": {
"type": "keyword",
"normalizer": "my_normalizer"
}
}
}
}
Шаг 2: Индексировать все документы
Конечная точка: http://{{hostname}}:{{port}}/{{index}}/_doc/ -> 1,2,3,4 и т. Д.
{
"company_name" : "State Oil Fund of the Republic of Azerbaijan"
}
Шаг 3: - Поисковый запрос
Конечная точка: - http://{{hostname}}:{{port}}/{{index}}/_search
{ "query": {
"prefix" : { "company_name" : "az" }
}
}
Это приведет к ожидаемым ниже результатам: -
{
"took": 870,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "prerfixsearch",
"_type": "_doc",
"_id": "2ec9df0fc-dc04-47bb-914f-91a9f20d09efd15f2506-293f-4fb2-bdc3-925684a930b5",
"_score": 1,
"_source": {
"company_name": "AZ Infotech Inc"
}
},
{
"_index": "prerfixsearch",
"_type": "_doc",
"_id": "160d01183-a308-4408-8ac1-a85da950f285edefaca2-0b68-41c6-ba34-21bbef57f84f",
"_score": 1,
"_source": {
"company_name": "Aziia Avto Ust-Kamenogorsk OOO"
}
},
{
"_index": "prerfixsearch",
"_type": "_doc",
"_id": "1da878175-7db5-4332-baa7-ac47bd39b646f81c1770-7ae1-4536-baed-0a4f6b20fa38",
"_score": 1,
"_source": {
"company_name": "AZURE Midstream Partners LP"
}
}
]
}
}
Объяснение: , как ранее OP не было; tупомяните исключение 4-го документа в результатах поиска, поэтому я предложил создать текстовое поле, чтобы генерировать отдельные токены, но теперь, поскольку требование - это только поиск по префиксу, нам не нужны отдельные токены, и мы хотели бы только1 токен, но он должен быть в нижнем регистре для поддержки поиска без учета регистра, поэтому я применил пользовательский нормализатор к полю company_name
.