Проблема не в сортировке - проблема в запросе. Попробуйте использовать запрос match вместо term. Запрос term не выполняет анализ запросов и поэтому может не вернуть ожидаемые результаты.
Морфология не актуальна для названий улиц, и даже может навредить. Когда Вы ищете по тексту, и в поиске задан термин повелецкий, то с помощью русской морфологии можно будет найти и текст со словам павелецком, и текст со словом павелецкая.
В случае поиска по географическим названиям, скорее всего, пользователь который ищет станцию метро "Пионерская" вряд ли будет заинтересован в нахождении "Пионерского" пруда, поэтому производить морфологический анализ бесполезно и даже, в некоторых случаях, вредно.
Вы не могли бы задать этот вопрос на более техническом уровне. "Нормальный" -понятие растяжимое, и левая выдача для одного типа задач - правильная выдача для другого. Я понимаю, что точно определить, как оптимальный поиск должен работать достаточно сложно. Поэтому можно было бы начать с примера с данными, запросами, результатом, который этот пример выдает и ожидаемым результатом, который вы хотели бы видеть.
Если вам важно совпадение по слову "мост", то это вполне нормально, тем более, что кузнецкий мост появляется в результатах перед богатырским. Если вам необходимо совпадение по все словам, которые появляются в запросе, то вам надо переключится на другой режим в запросе match. Например с использованием оператора and, если вам важно совпадение всех слов в запросе
Но при этом кузнецкий мо вам больше ничего возвращать не будет, потому, что у вас n-gram начинаются с 3, а нужно, чтобы они начинались с 1.
Вариантов много. Надо только точно определиться, что является "нормальным" для вас. И, главное, не подходить к elasticsearch, как к какому-то магическому существу, которое может залезть к вам в голову и точно определить, что вы хотите найти. Тут никакой магии нет - все дело в простом совпадении генерируемых токенов при запросе и индексировании. И контроль над тем, как эти токены генерируются - в ваших руках. Если вы не хотите этот контроль, то лучше использовать более простые средства - анализатор standard и запрос match_phrase_prefix.
С operator стало все яснее, еще пробую другие варинаты.
Про минимальный лимит ngram вылетело из головы вообще )
Мне кажется если бы вы реализовали механизм запросов через sql было бы удобнее и понятнее.
Многое не понятно новичку, тк тут совсем другая идеология.
В том же sphinx все через sql и довольно быстро можно освоиться, с sql то все знакомы )
Так в этом-то и все дело! Если бы мы реализовали механизм запросов через sql, то пользователи бы стали пользоваться elasticsearch как реляционной базой, и ни к чему хорошему это бы не привело. Elasticsearch это поисковый движок, который использует совсем другие модели данных, которые базируются на совсем других математических моделях и алгоритмах, и поэтому он требует иного подхода к моделированию данных и построению запросов.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.