2016-02-09 3 views
1

Я проиндексировал 726719-B21 в текстовом поле, на котором я применил ниже анализаторы.Проблема с поиском Solr с разделителями дефисов «-»

<analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 

Теперь, когда я искать это слово дефис работает как разделитель так он будет получать результаты, которые содержат , а также B21. Мне нужен только результат, который имеет 726719-B21.

Как использовать/настроить WordDelimiterFilterFactory слово поиска 726719-B21?

Как я могу это достичь? Пожалуйста, предложите.

ответ

1

StandardTokenizerFactory явным образом разделить любой маркер на -:

Обратите внимание, что слова расщеплены на дефис.

ClassicTokenizerFactory является более ранняя версия того же Tokenizer, но у него есть специальное правило:

Слова расщеплены на дефис, если не число в слове, в этом случае маркер не разделяется, а числа и дефис (ы) сохраняются.

Подходит ли это в зависимости от вашего ввода. Если у вас может быть 726719-BAT, тогда это не подойдет.

Другой вариант - просто использовать WhitespaceTokenizerFactory, который будет разделен только на фактические пробелы (где тест java isWhitespace() оценивается как истинный).

Но если вы только индексировать 726719-B21 в поле и только хотите, чтобы соответствовать его полностью, вы можете использовать вместо StrField (обычно определяется как string в вашей схеме) - или, если вы хотите, чтобы это было чувствительно к регистру, использование a KeywordTokenizer вместе с нижним регистром.

Другие фильтры, которые вы определили в своей последовательности, также могут изменить ваш контент фундаментальными способами (например, отключение, когда конец токенов будет удален, если они соответствуют любому из заранее определенного набора шаблонов).

+0

Я уже пробовал с WhitespaceTokenizerFactory, но не повезло. Моревр, я не могу добавить его в поле строки или StrField. Потому что требование - искать в нижнем регистре. – Ankita

+0

@Ankita Помните, что после изменения токенизатора вам придется переиндексировать любой контент, а мое другое предложение с KeywordTokenizer сохранит значение as-is, но с возможным строчным фильтром, чтобы сделать его нечувствительным к регистру. – MatsLindh

-2

Вы всегда можете найти с близостью.

Это головная боль, но вам не нужно переиндексировать ваши данные.

"726719 B21" ~ 1

Это не идеальный (так как он найдет B21-727719), но это может быть достаточно хорошим.

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