Solr搜索相关性提升和bf加权无法使用内容^ 1

时间:2015-04-23 11:21:36

标签: search solr lucene

我需要微调我的搜索相关性和权重,因为返回的结果是:

  • 与搜索无关

  • 标题搜索不会将匹配的商家信息返回到顶部

Solr 请求处理程序的配置片段:

<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
  <str name="defType">edismax</str>
  <str name="echoParams">explicit</str>
  <int name="rows">10</int>
  <str name="df">text</str>
  <str name="q.alt">*:*</str>
  <str name="q.op">AND</str>
  <str name="qf">title^15.0 description^9.0 categoryNames^3.0 authorName^1.0 content^1.0</str>
  <str name="boost">scoreA</str>
</lst>
<lst name="appends">
  <str name="fq">private:false</str>
  <str name="fq">deleted:false</str>
  <str name="fq">draft:false</str>
</lst>

Solr 架构摘要:

<field name="content" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="type" type="string" indexed="true" stored="true"/>
<field name="title" type="text_en_splitting" indexed="true" stored="true"/>
<field name="description" type="text_en_splitting" indexed="true" stored="true"/>
<field name="url" type="string" indexed="false" stored="true"/>
<field name="authorId" type="long" indexed="true" stored="true"/>
<field name="authorName" type="text_en" indexed="true" stored="true"/>

  <copyField source="title" dest="text"/>
  <copyField source="description" dest="text"/>
  <copyField source="content" dest="text"/>

<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <charFilter class="solr.HTMLStripCharFilterFactory"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

twigkit搜索查询:

    

<search:query var="query" type="all" parameters="*" resultsPerPage="18" sorts="-scoreA" fields="id,url,price,title,description,recommended,modifiedDate,downloadCount:field(downloadCount),ratingAverage:field(ratingAverage),ratingCount:field(ratingCount),scoreA:field(scoreA),scoreB:field(scoreB),viewCount:field(viewCount),authorName,authorId,content,categoryNames">
</search:query>

<search:response var="response" platform="${platform}" query="${query}"></search:response>

到目前为止我的发现: 如果我从 Solr qf params中删除内容^ 1加权,那么相关性搜索和标题搜索就能完美运行。获得预期的结果。

但如果我将内容^ 1加权在 Solr qf中,那么一切都会出错。

问题可能与此有关,但不确定:

在Solr架构中,我的内容类型为:

type="text_en_splitting"

此字段类型已应用此过滤器:

<filter class="solr.PorterStemFilterFactory"/>

在具有索引和查询值的solr控制台中运行分析器时:     第一次世界大战完成单位

我可以看到它到达上面的过滤器时,值是:

first world war complet unit 

&#39;&#39;完全&#39;省略了字。

以下是“内容^ 1&#39;在qf中:

"responseHeader": {
"status": 0,
"QTime": 187,
"params": {
  "lowercaseOperators": "true",
  "spellcheck": "true",
  "facet": "true",
  "sort": "scoreA desc",
  "indent": "true",
  "qf": "title^15.0 description^9.0 categoryNames^3.0 authorName^1.0 content^1",
  "spellcheck.collate": "true",
  "wt": [
    "json",
    "javabin"
  ],
  "hl": "true",
  "version": "2",
  "defType": "edismax",
  "rows": "18",
  "fl": "id,url,price,title,description,recommended,modifiedDate,downloadCount:field(downloadCount),ratingAverage:field(ratingAverage),ratingCount:field(ratingCount),scoreA:field(scoreA),scoreB:field(scoreB),viewCount:field(viewCount),authorName,authorId,content,categoryNames,score",
  "start": "0",
  "q": "world wars",
  "q.op": "AND",
  "_": "1429801074587",
  "facet.field": [
    "categories",
    "categoryRoot",
    "resourceTypes",
    "fileTypes",
    "recommended",
    "licence"
  ],
  "stopwords": "true"
}

进一步的结果:

在使用查询“世界大战”进行搜索时,“战争”这个词就是&#39;由于它在前几个列表附件中发现了很多次,所以它的权重很大。如果“战争”这个词好像得分提高了。被发现是一个单独的单词或作为另一个单词的一部分。例如,&#39; war&#39;和小心#39;

我只需要在“战争”时加强内容得分。被发现是一个完整的单词,如果在其他单词中找到,则不做任何事情。希望有道理。

1 个答案:

答案 0 :(得分:1)

  

此问题的最终解决方案是使用sort=scoreA desc代替sort=score desc&boost=scoreA而不是scoreA。这使用score的提升值作为Solr score的乘数,然后使用content^0.1进行排序,其中考虑了Solr自身的相关性数学和提升值。最初的答案和导致这一结论的对话如下。

听起来你对其他领域的相对权重感到满意,但即使权重较低,与其他领域相比,内容相关。

最可能的解决方案是调整重量,要么降低内容的重量,要么增加其他字段的重量。也许q.op=AND可以为您提供所需的结果。如果包含内容字段的唯一目的是在更重要的地方找不到匹配项时找到匹配项,那么设置极低的相对权重将确保&#34;内容&#34;匹配永远不会超过其他领域的匹配。

通常,我发现solr.explain.pl是调试Solr相关性的有用工具。它从您已激活可选相关性解释输出的测试Solr查询中获取查询结果,并为您提供如何确定每个结果文档的相关性的图形表示。它不能很好地处理具有自己的逻辑运算符的复杂查询,但通过简单的测试查询,可以帮助您了解相关性顺序的确定方式,以便您可以对其进行适当调整。

编辑:既然您已添加了回复代码段,我注意到您使用的是mm,但这是Standard Query Parser的一项功能。由于您正在使用Extended Dismax Query Parser,因此您应该使用mm=100%Minimum Match)参数。对于Dismax和Extended Dismax查询解析器,q.op=AND相当于orphanRemoval=true。我不知道这是否与您遇到的问题有关,但可能是。