【问题标题】:Solr: Integrating Partial Match and Exact Match resultsSolr:整合部分匹配和精确匹配结果
【发布时间】:2017-03-28 15:06:14
【问题描述】:

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

  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>

因此,如果用户搜索“ercedes”,则将返回两个 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”,因为它是完全匹配,但对于部分匹配则没有。

是否有可能以某种方式拥有与第一个模式类似的模式,即它可以返回部分匹配但也可以在完全匹配时返回与单个字符术语的匹配?

谢谢 标记

【问题讨论】:

    标签: search solr


    【解决方案1】:

    你可以这样做:

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

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

    【讨论】:

    • 感谢您的建议,我是 Solr 的初学者,所以我需要进一步研究您的建议。
    猜你喜欢
    • 2017-03-02
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多