Это хороший вопрос, и напрямую вы не можете получить точное совпадение сверху, вам нужен анализатор ngram, который предоставляет частичные совпадения, и другое поле, в котором хранятся точные токены в нижнем регистре (текстовое поле со стандартным анализатором решит это ).
Я воспроизвел вашу проблему и решил ее, используя вышеупомянутый подход. Пожалуйста, обратитесь к мой блог об автозаполнении и мой этот SO-ответ для более глубокого чтения различных автозаполнений / частичных поисков и почему / что / как его часть.
Рабочий пример
Создание сопоставления индексов
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 10
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
},
"index.max_ngram_diff" : 10
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"title_lowercase" :{
"type" : "text"
}
}
}
}
Проиндексируйте образцы документов
{
"title" : "Homework",
"title_lowercase" : "Homework"
}
{
"title" : "work",
"title_lowercase" : "work"
}
Поисковый запрос
{
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "work"
}
}
},
{
"match": {
"title_lowercase": {
"query": "work"
}
}
}
]
}
}
}
И ожидаемый результат
"hits": [
{
"_index": "internaledge",
"_type": "_doc",
"_id": "1",
"_score": 0.9926754, /note score of `work` is much higher than`homework`
"_source": {
"title": "work",
"title_lowercase": "work"
}
},
{
"_index": "internaledge",
"_type": "_doc",
"_id": "2",
"_score": 0.2995283,
"_source": {
"title": "Homework",
"title_lowercase": "Homework"
}
}
]