Не знаю как по сравнению с nGram'ами, нужно тестировать, но есть вариант использовать
fuzzy-запросы:
GET /_search
{
"query": {
"fuzzy" : {
"fname" : {
"value" : "ма",
"fuzziness" : 10, // этот параметр для вашей задачи нужно выставлять повыше
"prefix_length" : 2, // будет равняться кол-ву уже введенных символов
"max_expansions": 100 // также выставляется повыше
}
}
}
}
Но вообще такие нечеткие fuzzy-запросы для ластика весьма "тяжелы". Так что этот подход имеет смысл использовать только если у вас база не исчисляется миллионами записей и/или гигабайтами занимаемого места.