4

我在 Solr/Lucene (3.x) 中有一个带有特殊复制字段 facet_headline 的文档,以便为分面提供一个未提取的字段。

有时 2 个或多个单词属于一起,这应该被视为一个单词,例如“kim jong il”。

所以标题“星期六:金正日去世”应该拆分为:

Saturday kim jong il had died

出于这个原因,我决定使用受保护的词(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一切正常,术语不会拆分。

有没有办法达到我的目标:不拆分特定的单词/单词组?

4

2 回答 2

2

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

WordDelimiterFilterFactory是一个标记过滤器,所以它的工作是添加、删除或更改已经生成的标记,(在这种情况下,根据大小写转换、连字符等将单词拆分为子单词),而不是将文档拆分为单词,这是分词器的工作(在本例中为PatternTokenizerFactory)。似乎您的标记器缺少 a \s,因此它没有拆分单词并且WordDelimiterFilterFactory正在获取整个短语。

在您的示例中,WordDelimiterFilterFactory将获取整个短语Saturday kim jong il had died,并且由于它与您的任何受保护单词都不匹配,因此它会继续将此“单词”拆分为子单词(空格是非字母数字字符,因此该单词符合条件用于分割)。

所以这是一个可能的解决方案。将 a 添加\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 邮件列表中查看此消息。它有点过时,但可以对问题有所了解。

于 2011-12-20T13:53:20.507 回答
0

在网上搜索后发现,这是不可能达到的目标。看起来,这不是所有分词器和过滤器的重点。

于 2012-01-11T13:58:54.540 回答