【问题标题】:how to show Solr search exact match before fuzzy match search result?如何在模糊匹配搜索结果之前显示 Solr 搜索完全匹配?
【发布时间】:2013-04-19 10:56:24
【问题描述】:

使用 Solr Apache。我想先显示精确匹配,然后在搜索中显示模糊匹配。

例如,我尝试查找世界 test 但是在响应中,我得到的结果是 cast, latest 之类的世界,然后是包含实际单词 的结果首先测试

我尝试了这样的查询:test^100 OR test~^5,但这并没有改变结果的顺序,也许这个查询的改变是不正确的。

我的 Solr 配置:

solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
    <str name="defType">edismax</str>
    <int name="rows">10</int>
    <str name="df">text</str>
    <str name="wt">php</str>
    <str name="sort">score desc</str>
    <str name="fl">*, score</str>

   <!-- Highlighting defaults -->
   <str name="hl">on</str>
   <str name="hl.fl">*</str>
   <str name ="hl.snippets">10</str>
   <str name="hl.fragsize">250</str>
   <str name="tie">0.1</str> 
   <str name="hl.simple.pre">&lt;b style="color:black;background-color:#888888"&gt;</str>
   <str name="hl.simple.post">&lt;/b&gt;</str>
   <str name="hl.usePhraseHighlighter">true</str>
   <str name="hl.highlightMultiTerm">true</str>
   <str name ="hl.useFastVectorHighligher">true</str>
   <str name ="hl.maxAnalyzedChars">200000</str>
   <str name="f.title.hl.alternateField">title</str>
   <str name="f.description.hl.alternateField">description</str>
   <str name="spellcheck">true</str>
 </lst>

schema.xml  
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="50"/>
      <filter class="solr.StandardFilterFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.TrimFilterFactory" />
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      <filter class="solr.StandardFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StandardFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
  </analyzer>
</fieldType>

谢谢,

【问题讨论】:

    标签: apache solr


    【解决方案1】:

    我一直在寻找相同问题的解决方案。在浏览了一些文档和邮件论坛之后,我意识到 solr 中没有内置方法可以直接实现这一点。 虽然这种方法不是一种非常干净和有效的方法,但我是这样解决这个问题的:

    创建查询的副本并在每个单词的末尾附加“~”(波浪号),保留不带波浪号的查询副本并将其提升更高。结果的数量保持不变,只有完全匹配的排名更高。

    For e.g: (bangalore)^20 (bangalore~)10
    

    但是,这种方法可能不如普通搜索有效,因为每个词都有两个需要搜索的标记,但如果相关性比效率更重要,那么可以这样做。此外,查询中的额外字词不会像预期的那样减慢搜索速度。

    【讨论】:

      【解决方案2】:

      一种方法是使用“提升排名术语”,通过创建一个布尔查询,将主要查询部分标记为强制,将排名术语标记为高提升的可选。

      您的查询应该类似于以下内容之一:

      +(basequery) rankingterm1^100
      +(basequery) rankingterm1^10000 rankingterm2^100
      

      例如:

      +(test OR test~) test^100
      

      由于加号+,因此括号之间的内容是强制性的,而括号外的内容是可选的,具有高提升,因此如果文档同时匹配两个术语(basequery和rankingterm / s),它将获得高于只匹配查询(basequery)的强制部分的文档

      您可以在此处阅读更多信息:https://cwiki.apache.org/confluence/display/solr/SolrRelevancyCookbook#SolrRelevancyCookbook-BoostingRankingTerms

      【讨论】: