2013-03-04 3 views
0

Я относительно новичок в Solr, поэтому, пожалуйста, простите меня, если мне не хватает чего-то очевидного. У меня есть приложение, которое позволяет пользователям искать музыкальных исполнителей. Индексирование происходит из базы данных только для чтения с правильными написаниями, поэтому на стороне индекса, которую я выяснил.solr PatternReplaceCharFilterFactory работает неожиданно

На стороне запроса, однако, мне нужно предвидеть различные орфографические ошибки/различия и хочу помочь solr найти эти экземпляры. Из нашего старого домашнего поискового решения у меня есть список регулярных выражений и художников, к которым они обращаются. Когда я пытался перевести их в solr, используя PatternReplaceCharFilterFactory, я заметил, что некоторые работали отлично, в то время как другие вообще не работали ... с кажущимся не рифмой и не причиной между ними.

Например:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="em[ei]n[ei]m" replacement="Eminem"/> 

точно фиксирует общие орфографические ошибки Эминема. Но для полосы 311:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[Tt]hree [Ee]leven" replacement="311"/> 

Не работает. Другим примером является Nine Inch Nails:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((nine|9).*inch.*nails\b)|(n\.? ?i\.? ?n\.?\b)" replacement="Nine Inch Nails"/> 

прекрасно подходит для поиска наиболее распространенных паттернов для названия группы. Но для Eve 6:

 <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[Ee]ve.{0,4}([Ss]ix|6)" replacement="Eve 6"/> 

Есть ли что-то фундаментальное, что я пропускаю при использовании этого фильтра? Я пробовал ряд вариаций в регулярном выражении, о котором я упоминал выше (даже до тех пор, как использовать литералы типа «три одиннадцать»), но все же без успеха. Я попытался сделать фильтр в вопросе единственного PatternReplaceCharFilterFactory в анализаторе. Я также точно знаю, что эти элементы находятся в индексе правильно, потому что, когда я ищу правильное написание, он возвращает правильные результаты.

Любые предложения?

Snowdall

ответ

3

Я подозреваю, что проблема не связана с вашей Чар завода, но с тем, что приходит в конце концов, в частности Tokenizer. Если вы используете стандартный токенизатор, он избавится от номеров, которые вы только что разместили в своем потоке. Если вам не нужен текст, который нужно разделить на токены, вы можете посмотреть на KeywordTokenizerFactory.

В общем, лучший способ устранить эту проблему в Solr 4+ - это экран анализа в WebUI администратора. Он позволяет вам вводить текст против определенного типа поля и видеть, что с ним происходит после каждого компонента в цепочке анализа.

0

Я бы рекомендовал использовать SynonymFilter для описания описываемого вами приложения. Это позволяет обеспечить внешний файл, в котором список слов и их синонимы, например:

eminem <=> emenem 
nine <=> 9 

Если перед этим с LowerCaseFilter, вам не придется суетиться случае нормализации в ваших синонимов. Вы должны иметь возможность обрабатывать 311-й случай, если вы не используете токенизацию (т. Е. Используйте KeywordTokenizer, как предложил Александр Рафалович).

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