solr没有标记受保护的单词

时间:2011-12-20 12:03:10

标签: solr lucene tokenize protected words

我在Solr / Lucene(3.x)中有一个带有特殊复制字段facet_headline的文档,以便有一个用于刻面的非限制字段。

有时候有两个以上的单词属于一起,这应该被处理/统计为一个单词,例如“kim jong il”。

所以标题为“星期六:kim jong il已经去世”应分为:

Saturday kim jong il had died

出于这个原因,我决定使用受保护的单词(protwords),我添加kim jong ilschema.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 个答案:

答案 0 :(得分:2)

这就是我认为它正在发生的事情。

WordDelimiterFilterFactory是一个令牌过滤器,因此它的工作是添加,删除或更改已生成的令牌(在这种情况下,根据案例转换,连字符等将单词拆分为子词), 将文档拆分为单词,这是tokenizer的作业(在本例中为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邮件列表中的this message。它有点过时了,但对这个问题提供了一些见解。

答案 1 :(得分:0)

在搜索网络后,我们发现了一个无法达到目标的问题。 看起来,这不是所有标记器和过滤器的重点。