Как сортировать результаты поиска на основе позиции слова в запросе 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"
                 }
            }

Ответы (0 шт):