Solr:词干突破突出

时间:2014-10-09 20:23:14

标签: solr stemming hit-highlighting

我将部分字段从text_general更改为text_en,希望利用词干和其他一些改进,但不幸的是,这一变化突显了突出显示。它似乎只是想突出非词干的词(即词干版本与词本身相同的词,如“孩子”)。

我正在使用默认的fieldType定义:

 <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
     <tokenizer class="solr.StandardTokenizerFactory"/>
     <filter class="solr.StopFilterFactory"
             ignoreCase="true"
             words="lang/stopwords_en.txt"
             />
     <filter class="solr.LowerCaseFilterFactory"/>
     <filter class="solr.EnglishPossessiveFilterFactory"/>
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
     <filter class="solr.PorterStemFilterFactory"/>
   </analyzer>
   <analyzer type="query">
     <tokenizer class="solr.StandardTokenizerFactory"/>
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
     <filter class="solr.StopFilterFactory"
             ignoreCase="true"
             words="lang/stopwords_en.txt"
             />
     <filter class="solr.LowerCaseFilterFactory"/>
     <filter class="solr.EnglishPossessiveFilterFactory"/>
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
     <filter class="solr.PorterStemFilterFactory"/>
   </analyzer>
 </fieldType>

在我的查询中使用hl.fl=title&hl=true启用突出显示。如果重要的话,这也是一个分面搜索。

在这种情况下,正如我所说,只会突出显示像“孩子”这样的未提及的词。如果我在text_en定义中从索引分析器中删除了词干过滤器(仅查询分析器似乎没有效果),则突出显示除停用词之外的所有匹配词。此外,如果我更改text_en以使用EnglishMinimalStemFilterFactory,则会突出显示更多单词,我认为这是因为它们是由Porter词干分析器阻止的,而不是由此阻止的。这样一个词的一个例子是“跨步”。

有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:2)

我知道这个问题已经死了,但对于读这篇文章的人来说,这是我的解决方案。

首先,请注意,只有在使用&#34; hlq&#34;时才会出现此行为。如果你正在使用&#34; q&#34;作为突出显示查询以及搜索查询,事情应该没问题。但如果这不是您的应用程序所需要的,那么您可以这样做:

在您的分析器链中,对于索引和查询,请添加:

<!-- will keep both the stemmed and unstemmed versions from any stemmer -->

<filter class="solr.KeywordRepeatFilterFactory" />

<!-- put your stemmer here, something like: -->

<filter class="solr.SnowballPorterFilterFactory"/>

<!-- if unstemmed == stemmed, only keep one -->

<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

基本上,这将保留带有词干和非词干版本的所有单词,然后删除重复项。现在突出显示将匹配文档(它仍将仅匹配作为hlq输入的EXACT短语,而q将匹配具有相同词干的任何内容,因此可能仍然存在q返回的具有空白突出显示字段的一些文档)