Вот то, что, я думаю, происходит.
WordDelimiterFilterFactory
- это фильтр токенов, поэтому его задача - добавлять, удалять или изменять уже сгенерированные токены (в данном случае разбивать слова на подслово).основанный на переходах регистра, дефисах и т. д.), не для разделения документов на слова, что является заданием для токенизатора (в данном случае PatternTokenizerFactory
).Кажется, что ваш токенизатор пропускает \s
, поэтому он не разделяет слова и WordDelimiterFilterFactory
получает целые фразы.
В вашем примере WordDelimiterFilterFactory
будет получать всю фразу Saturday kim jong il had died
и,так как оно не соответствует ни одному из ваших защищенных слов, оно продолжает разбивать это «слово» на подслово (пробел является не алфавитно-цифровым символом, поэтому слово подходит для разбиения).
Итак, вотвозможное решение.Добавьте \s
к вашему шаблону токенизатора и затем используйте KeywordMarkerFilterFactory для защиты ваших слов.Примерно так:
<fieldType name="facet_headline" class="solr.TextField" omitNorms="true">
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s|\?|\!|\.|\:|\;|\,|\"|\(|\)|\\|\+|\*|<|>|([0-31]+\.)" />
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"
ignoreCase="false"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="0" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
</analyzer>
</fieldType>
Обновление : ОК, теперь, когда я дважды проверил документацию, это предлагаемое решение вряд ли будет работать для вас.Я бы сосредоточился на экспериментах с SynonymFilterFactory .Проверьте это сообщение в списке рассылки solr-user.Это немного устарело, но дает некоторое представление о проблеме.