2011-12-20 2 views
3

У меня есть документы в Solr/Lucene (3.x) со специальным полем facet_headline для копирования, чтобы иметь нефиксированное поле для огранки.solr not tokenizing защищенные слова

Иногда несколько слов принадлежат друг другу, и это должно обрабатываться/считаться одним словом, например «kim jong il».

Так заголовок «Суббота: Ким Чен Ир умер» следует разделить на:

Saturdaykim jong ilhaddied

По этой причине я решил использовать защищенные слова (protwords), где я добавить kim jong il , schema.xml выглядит следующим образом.

<fieldType name="facet_headline" class="solr.TextField" omitNorms="true"> 
     <analyzer> 
      <tokenizer class="solr.PatternTokenizerFactory" pattern="\?|\!|\.|\:|\;|\,|\&quot;|\(|\)|\\|\+|\*|&lt;|&gt;|([0-31]+\.)" /> 
      <filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="0" 
        protected="protwords.txt" /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.TrimFilterFactory"/> 
      <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
     </analyzer> 
    </fieldType> 

Использование анализа solr похоже, что это не работает! Строка по-прежнему разделена на 6 слов. Похоже, файл protword.txt не используется, но если заголовок ТОЛЬКО содержит имя: kim jong il все работает нормально, условия не разделяются.

Есть ли способ достичь моей цели: не разделить конкретные слова/группы слов?

ответ

0

после поиска в сети дошло до того, что достичь цели невозможно. Похоже, это не фокус всех токенизаторов и фильтров.

2

Вот что я думаю, что это происходит.

WordDelimiterFilterFactory является маркером фильтром, поэтому его работа состоит в том, чтобы добавить, удалить или изменить уже сформированные маркер, (в данном случае, чтобы разделить слова на суб-слова на основе тематических переходов, дефисы и т.д.), не разделять документы на слова, что является заданием для токенизатора (в данном случае PatternTokenizerFactory). Кажется, что ваш токенизатор отсутствует \s, поэтому он не разбивает слова, а WordDelimiterFilterFactory получает целые фразы.

В вашем примере, WordDelimiterFilterFactory будет получать всю фразу Saturday kim jong il had died и, поскольку он не соответствует ни одному из защищаемых слов, оно происходит деление «слово» в суб-слов (а пробельные не является alpanumeric характер, поэтому слово квалифицируется для расщепления).

Итак, это возможное решение. Добавьте \s к вашему шаблону токенизатора, а затем используйте KeywordMarkerFilterFactory для защиты ваших слов. Что-то вроде этого:

<fieldType name="facet_headline" class="solr.TextField" omitNorms="true"> 
    <analyzer> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="\s|\?|\!|\.|\:|\;|\,|\&quot;|\(|\)|\\|\+|\*|&lt;|&gt;|([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> 

Update: Хорошо, теперь, когда я дважды проверил документацию, это предлагаемое решение вряд ли будет работать для вас. Я бы сосредоточился на эксперименте с SynonymFilterFactory. Проверьте this message в списке рассылки solr-user. Это немного устарело, но дает некоторое представление о проблеме.

+0

Я удалил '\ s' из' PatternTokenizerFactory' в надежде, что 'WordDelimiterFilterFactory' расколоет документ на пробелы, закроет просрочки. Но после того, как я прочитал ваши анализы, я думаю, я понял проблему. поэтому я попробую вашу модификацию. минуточку. –

+0

Забудьте о моем «решении», это, скорее всего, не сработает. Я неправильно понял, как «KeywordMarkerFilterFactory»; это только защитит ваши слова от последующего истощения. Я уточню свой ответ. – Chewie

+0

> Забудьте о моем «решении» <я вижу - 'PatternTokenizerFactory' разделит термин до того, как будут обработаны какие-либо прожекторы. Правильно, 'KeywordMarkerFilterFactory' имеет значение для stemting –

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