Solr не токенизировать защищенные слова - PullRequest
3 голосов
/ 20 декабря 2011

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

Иногда 2 или более слов принадлежат друг другу, и это должно быть обработано / засчитано как одно слово, например "ким чен ил".

Таким образом, заголовок "Суббота: Ким Чен Ир умер" должен быть разделен на:

Saturday kim jong il had died

По этой причине я решил использовать защищенные слова (прототипы), где я добавляю 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 все работает нормально, термины не разделены.

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

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

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

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|\?|\!|\.|\:|\;|\,|\&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>

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

0 голосов
/ 11 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...