2012-06-04 5 views
1

Я пытаюсь реализовать местоположение (города, регионы, страны, объекты) нечеткий поиск с использованием Solr-сервера. В настоящее время мой индекс содержит около 0,8-1,0 М пунктов. Он работает очень хорошо, используя нечеткий поиск (~ 0,7), но слишком медленный для меня (часто 0.2-0.6 сек). Используемый токенизатор - <tokenizer class="solr.StandardTokenizerFactory"/>. В качестве альтернативы я попробовал <tokenizer class="solr.WhitespaceTokenizerFactory"/> - это замечательно с точки зрения производительности (примерно в 100 раз быстрее), но он не предлагает нечеткого поиска :(Solr/Lucene нечеткий поиск слишком медленный

Знаете ли вы какой-либо другой подход, который я мог бы использовать? Я хотел бы воспользоваться использованием нечеткого поиска особенность, но в гораздо более быстром способе, если это возможно.

Большого спасибо!

+0

Можете ли вы привести пример нечеткого поиска, который вы ищете? Я имею в виду, если пользователь вводит q = California ~ то, как должен выглядеть ваш результат? – Yavar

+0

Несомненно. В качестве хорошего примера я бы сказал имя: «Guadelupe» ~ 0,7 матча «Guageloupe». В первом случае (StandardTokenizer) он работает, потому что, я думаю, он токенизирует слова в более короткие токены. Для WhitespaceTokenizer каждый токен - это слово.Индекс меньше и, следовательно, быстрее, но релевантность хуже. Как вы думаете? –

ответ

2

Ваша проблема не связана с анализатором, который вы используете. Когда вы ищете 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, он должен выполнить нечеткий поиск, я думаю.

+1

Указать n-gram тоже. – aitchnyu

Смежные вопросы