Solr:集成部分匹配和完全匹配结果

时间:2017-03-28 15:06:14

标签: search solr

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

  1. Mercedes C class
  2. 梅赛德斯A级
  3. 宝马3系列
  4. 马自达3
  5. 我有一个模式会返回部分匹配的结果。如您所见,我将最小字符限制为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>
    

    因此,如果用户搜索“错误”,梅赛德斯的参赛作品都将被退回。如果用户搜索“C&#39;或者&#39; 3&#39;,因为架构设置了至少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&#39;将返回&#39; Mercedes C class&#39;因为它是完全匹配,但没有任何部分匹配。

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

    感谢 标记

1 个答案:

答案 0 :(得分:1)

你可以这样做:

  1. 声明两个(或更多)字段'carpartial'定义为string_contains,'carexact'定义为textStemmed。
  2. 使用copyfield将原始字段复制到其他字段
  3. 您使用edismax处理程序来查询这两个字段,但比另一个字段提升了一个:      qf = string_contains ^ 4 textStemmed ^ 6
  4. 你可能想要调整你的分析链,但是你看它是如何工作的,使用相同字段的不同变体(当然你可以添加更多),具有不同的提升。