Как сортировать результаты поиска на основе позиции слова в запросе Elasticsearch 8.2?
Я новичок в работе с Elasticsearch 8.2, так что если я чего-то не понимаю поправьте меня
Проект над которым я сейчас тружусь являться словарем со снами, логика такая Пользователь может вбить в поиск несколько слов и при получении результата документы должны сортироваться на основе своей позиции в поиске.
Все было реализовано через sort script. Но все работает не так хотелось бы. У слова может измениться окончание и тот алгоритм который я написал не будет работать. А что бы он работал нужно получить в документе слово по которому был найден этот документ.
Может вы сталкивались с подобными проблемами и подскажите как можно решить данную проблему или может быть есть другой метод решении данной задачи ? Спасибо
Создание индекса
"settings": {
"analysis": {
"analyzer": {
"ru": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"ru_RU",
"russian_stop"
]
}
},
"filter": {
"ru_RU": {
"type": "hunspell",
"locale": "ru_RU",
"dedup": true
},
"russian_stop": {
"type": "stop",
"stopwords": "а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я"
}
}
}
},
"mappings": {
"properties": {
"dictionary_id": {
"type": "integer",
},
"language_id": {
"type": "integer",
},
"name": {
"type": "text",
"analyzer": "ru"
},
"description": {
"type": "text",
"analyzer": "ru"
}
}
}
Поиск
"query": {
"bool": {
"must" : [
{ "match" : { "language_id": localeInfo.language_id } },
],
"should" : [
{ "match": { "name": query } },
],
"minimum_should_match": 1,
},
},
"sort": {
"_script": {
"script": `
if('${query}'.toLowerCase().indexOf(params._source.name.toLowerCase()) >= 0)
{
return'${query}'.toLowerCase().indexOf(params._source.name.toLowerCase()) + _score;
}
return ${query.length} + _score;
`,
"type": "number",
"order": "asc"
}
}