Задача построить такой индекс, который бы успешно находил запись "Johnson's Baby" по запросам "Джонсон с бэби", "Жонсон бэйби".
Мне кажется, что правильно использовать фильтр фонетики, с поддержкой английского и русского языков, чтобы в индексе хранилась некая универсальная транскрипция.
Это сложная проблема. Единственное хорошее решение, которое я видел базировалось на машинном обучении. Транслитерация сама по себе не сложна - см тут https://www.elastic.co/guide/en/elasticsearch/plugins/2.4/analysis-icu-transform.html Но, когда дело доходит до имен - большое количество исключений и исторически сложившихся написаний все портит.
Игорь, на самом деле у меня вопрос наверное даже проще.
Наши документы это наименования товаров, люди вводят вместо "Johnson's baby", "micro sd" "жонсонов с бэби" и прочее.
Думаю, для нашей задачи попробовать phonetic-filter можно, вот результаты вывода
org.apache.commons.codec.language.bm.BeiderMorseEncoder#encode (его использует алгоритм beider_morse) для некоторых вариантов из топа наших запросов:
Да, верно, тоже подебажил и обнаружил это, с cyrillic заработало.
Плюс, я неправильно использовал параметр languageset - если задать "cyrillic, english" то фильтроваться будут либо только латинские, либо только кириллические токены, весьма неочевидная оказалась для меня настройка.. Решил двумя фильтрами:
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.