繁体   English   中英

Solr:整合部分匹配和完全匹配结果

[英]Solr: Integrating Partial Match and Exact Match results

考虑一个包含以下内容的汽车数据库:

  1. 梅赛德斯C级
  2. 奔驰A级
  3. 宝马3系
  4. 马自达3

我有一个会返回部分匹配结果的模式。 如您所见,我将最小字符限制为2:

<fieldType class="solr.TextField" name="string_contains" positionIncrementGap="100">
   <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" enablePositionIncrements="true" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" maxGramSize="15" minGramSize="2"/>
        <filter class="solr.ReverseStringFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" maxGramSize="15" minGramSize="2"/>
        <filter class="solr.ReverseStringFilterFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
   </analyzer>
   <analyzer type="query">
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
   </analyzer>
</fieldType>

因此,如果用户搜索“步骤”,则将返回两个Mercedes条目。 如果用户搜索“ C”或“ 3”,则不会返回任何内容,因为该模式至少设置了2个字符。

我也有以下架构,它将返回任何完全匹配的内容:

<fieldType class="solr.TextField" name="textStemmed" omitNorms="true" positionIncrementGap="0">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" enablePositionIncrements="true" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="querystopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>

使用上面的内容,搜索“ C”将返回“ Mercedes C class”,因为它是完全匹配,但对于部分匹配则没有任何结果。

是否有可能采用一种与第一个相似的模式,即它可以返回部分匹配项,但当它们是完全匹配项时也可以返回单个字符项的匹配项?

谢谢马克

你可以这样做:

  1. 声明两个(或多个)字段“ carpartial”,它们定义为string_contains,“ carexact”为textStemmed。
  2. 使用copyfield将原始字段复制到那些其他字段中
  3. 您使用edismax处理程序来查询这两个字段,但比其他字段多了一个查询:qf = string_contains ^ 4 textStemmed ^ 6

您可能需要调整分析链,但是您会看到它是如何工作的,使用相同字段的不同变体(当然,您可以添加更多),并具有不同的提升。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM