Ваша проблема не связана с анализатором, который вы используете. Когда вы ищете Califrna ~ 0,7 Lucene перебирает все термины в индексе и (Левенштейн) расстояние редактирования между «Califrna» и всеми условиями. Это очень дорогостоящая операция.
Эта проблема будет решена с помощью Lucene версии 4.0. К сожалению, версия Lucene, поставляемая вместе с Solr, использует старый подход грубой силы.
https: //issues.apache.org/jira/browse/LUCENE-2089
Http: //java.dzone.com/news/lucenes-fuzzyquery-100-times
Если это это нормально для вас, я бы предложил загрузить Solr/Lucene с багажника и проверить, как работает новый нечеткий запрос.
http://wiki.apache.org/solr/NightlyBuilds
Даже если ствол является стабильным, не рекомендуется для использования в производстве. Я могу предложить вам два похожих метода:
1 - SpellChecker
http://wiki.apache.org/solr/SpellCheckComponent
Http: //www.lucidimagination.com/blog/2010/08/31/getting-started-spell-checking- с-apache-lucene-and-solr/
SpellChecker строит свой маленький индекс с n-граммами для быстрого поиска. Он также использует расстояние Левенштейна, но вместо повторения на всех терминах он вычисляет только расстояние на соответствующих терминах.
Вам нужно сначала выполнить проверку орфографии для «Califrna», и это предложит вам «Californa». Затем вы можете использовать «Калифорния» в своем запросе по вашему основному индексу без нечеткого запроса.
2- Авто Предлагайте
Http: //wiki.apache.org/solr/Suggester
Вы можете предложить правильное написание как тип запроса пользователя с Suggester компонентом. Это будет намного быстрее. Он поддерживает нечеткий поиск с классом JaspellLookup. JaspellLookup необходимо обновить, чтобы включить нечеткий поиск. Wiki не говорит много о том, что нужно обновлять. если usePrefix установлен в false, он должен выполнить нечеткий поиск, я думаю.
Можете ли вы привести пример нечеткого поиска, который вы ищете? Я имею в виду, если пользователь вводит q = California ~ то, как должен выглядеть ваш результат? – Yavar
Несомненно. В качестве хорошего примера я бы сказал имя: «Guadelupe» ~ 0,7 матча «Guageloupe». В первом случае (StandardTokenizer) он работает, потому что, я думаю, он токенизирует слова в более короткие токены. Для WhitespaceTokenizer каждый токен - это слово.Индекс меньше и, следовательно, быстрее, но релевантность хуже. Как вы думаете? –