Solr查询相同的关键字返回不同的结果?

时间:2014-07-27 09:42:53

标签: solr

我正在使用text_general类型在solr index中搜索以下配置。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SnowballPorterFilterFactory"/>
    <filter class="org.apache.solr.analysis.WordDelimiterFilterFactory" 
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="1"
                splitOnCaseChange="1"
                splitOnNumerics="1"
                preserveOriginal="1"
                stemEnglishPossessive="1"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />       
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SnowballPorterFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />       
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>       
  </analyzer>
</fieldType>

我为很多内容编制索引并使用关键字进行搜索:请,请和请。

PLEASE关键字查询返回非常小的结果集。

  

Q =%22PLEASE%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特

但请&amp;请给出大的结果集。

  

Q =%22please%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特

     

Q =%22Please%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特

即使我使用的是WordDelimiterFilterFactory,也应该考虑PLEASE,Please&amp;请作为相同的关键字?

任何想法。

2 个答案:

答案 0 :(得分:1)

您在使用标记器和过滤器时存在根本冲突。 SnowBallPorterFilterFactory要求小写输入正常工作:

  

公共最终类PorterStemFilter扩展TokenFilter

     

根据Porter词干分析算法转换令牌流。   注意:堵塞过滤器的输入必须是小写的,   所以你需要使用LowerCaseFilter或LowerCaseTokenizer   在Tokenizer链中,为了使其正常工作!

http://lucene.apache.org/core/4_9_0/analyzers-common/org/apache/lucene/analysis/en/PorterStemFilter.html

这会导致您在将流运行到SnowBallPorterFilterFactory之前在某处运行LowerCaseFilterFactory。

你也在使用词干之后使用WordDelimiterFilterFactory - 这意味着在通过WordDelimiterFilterFactory运行之后生成的新单词将不会被阻止。

修复它并不像预先放置LowerCaseFilterFactory那么简单,因为虽然这将解决SnowBallPorterFilterFactory问题,但它会干扰WordDelimiterFilterFactory在更改大小写时生成新单词。

我建议您尝试以下顺序:

StandardTokenizerFactory

WordDelimiterFilterFactory

LowerCaseFilterFactory

SynonymFilterFactory

StopFilterFactory

SnowballPorterFilterFactory

当您开始使用尽可能多的过滤器时,很难获得一个完美的订单,但我相信这将解决您当前的问题。与往常一样,我建议您使用文档集中的常用单词运行许多测试,以查看它与您所需输出的匹配程度。

答案 1 :(得分:0)

你遇到了这个问题,因为你在小写之前就已经出现了问题。我发现根据具体情况,不同的词干分子会根据不同的词汇来区分。在Solr Admin UI的“分析”选项卡中查看以下输出。你可以看到PLEASE与Please和please不同(或者根本没有),因此,后两者有不同的结果集。

ST PLEASE | please | Please
SF PLEASE | pleas | Pleas
WDF PLEASE | pleas | Pleas
SF PLEASE | pleas | Pleas
LCF please | pleas |pleas

要解决这个问题,我建议在小写之后运行stemmer作为最后一步。这将确保您的单词分隔符过滤器仍然有效。

希望它有所帮助。