我在Solr / Lucene(3.x)中有一个带有特殊复制字段facet_headline的文档,以便有一个用于刻面的非限制字段。
有时候有两个以上的单词属于一起,这应该被处理/统计为一个单词,例如“kim jong il”。
所以标题为“星期六: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="\?|\!|\.|\:|\;|\,|\"|\(|\)|\\|\+|\*|<|>|([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
是一个令牌过滤器,因此它的工作是添加,删除或更改已生成的令牌(在这种情况下,根据案例转换,连字符等将单词拆分为子词), 不将文档拆分为单词,这是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|\?|\!|\.|\:|\;|\,|\"|\(|\)|\\|\+|\*|<|>|([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)