【问题标题】:Solr query for same keyword returning different results?Solr查询相同的关键字返回不同的结果?
【发布时间】:2014-07-28 14:07:53
【问题描述】:

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

<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>

我索引了很多内容并使用关键字搜索:请,请,请。

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

q=%22PLEASE%22&q.op=OR&df=text&qt=%2Fselect&sort=content_name+desc&fq=content_source%3ASharepoint&AuthenticatedUserName=lalit

但是 Please & please 给出大的结果集。

q=%22please%22&q.op=OR&df=text&qt=%2Fselect&sort=content_name+desc&fq=content_source%3ASharepoint&AuthenticatedUserName=lalit

q=%22Please%22&q.op=OR&df=text&qt=%2Fselect&sort=content_name+desc&fq=content_source%3ASharepoint&AuthenticatedUserName=lalit

即使我使用 WordDelimiterFilterFactory,它也应该考虑 PLEASE, Please & please 作为相同的关键字?

任何想法。

【问题讨论】:

    标签: solr


    【解决方案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 在大小写更改时生成新单词。

    我建议尝试以下顺序:

    标准标记器工厂

    WordDelimiterFilterFactory

    小写过滤器工厂

    同义词过滤器工厂

    停止过滤器工厂

    SnowballPorterFilterFactory

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

    【讨论】:

      【解决方案2】:

      您遇到了这个问题,因为您在小写之前进行了词干提取。我发现不同的词干分析器会根据情况对单词进行不同的词干处理。查看 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
      

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

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 2014-09-24
        • 2011-11-08
        • 2013-08-30
        相关资源
        最近更新 更多