我想知道如何为多个词条的搜索结果获得不同的分数?
solr中的某些结果即使在查询中有多个术语时也具有相同的分数,正如您将在下面的示例中看到的那样。
Solr中有两个索引,每个索引包含:id、first_name、last_name每个索引看起来如下:
<doc>
<str name="id">1</str>
<str name="last_name">fisher</str>
<str name="name">john</str>
</doc>
<doc>
<str name="id">2</str>
<str name="last_name">darby</str>
<str name="name">john</str>
</doc>
当我只查询"john"时,会出现两个结果。这太完美了。然而,当我查询"johnfisher"时,两个结果都出现了,但得分相同。我想要的是根据搜索词的相关性获得不同的分数。
以下是以下查询的结果http://localhost:8983/solr/select?q=john+fisher%0D%0A&行=10&fl=*%2 得分
<response>
...
<result name="response" numFound="2" start="0" maxScore="0.85029894">
<doc>
<float name="score">0.85029894</float>
<str name="id">1</str>
<str name="last_name">fisher</str>
<str name="name">john</str>
</doc>
<doc>
<float name="score">0.85029894</float>
<str name="id">2</str>
<str name="last_name">darby</str>
<str name="name">john</str>
</doc>
</result>
</response>
如有任何帮助,将不胜感激
您最好的选择是理解&分析不同因素如何影响你的文档评分,Lucene有有用的功能Explanation
,Solr利用它来提供评分的计算方法。你可以在Solr中使用"debugQuery"来查看它是如何派生的,
?q=john&fl=score,*&rows=2&debugQuery=on
Ex响应:
<lst name="debug">
<str name="rawquerystring">john</str>
<str name="querystring">john</str>
<str name="parsedquery">+DisjunctionMaxQuery((text:john))</str>
<str name="parsedquery_toString">+(text:john)</str>
<lst name="explain">
<!-- Score calulation for Result#1 -->
<str>
2.1536596 = (MATCH) fieldWeight(text:john in 36722), product of:
1.0 = tf(termFreq(text:john)=1)
8.614638 = idf(docFreq=7591, maxDocs=15393998)
0.25 = fieldNorm(field=text, doc=36722)
</str>
<!-- Score calulation for Result#2 -->
<str>
2.1536596 = (MATCH) fieldWeight(text:john in 36724), product of:
1.0 = tf(termFreq(text:john)=1)
8.614638 = idf(docFreq=7591, maxDocs=15393998)
0.25 = fieldNorm(field=text, doc=36724)
</str>
</lst>
除此之外,您还可以使用explainOther
来找出某个文档与查询不匹配的原因。
?q=john&fl=score,*&rows=2&debugQuery=on&explainOther=on
读取:
- Solr相关性
- Lucene评分
在我看来,您只是在"name"字段上搜索。这就是为什么分数是一样的。如果你使用DisMax,你可以很容易地在两个字段上搜索,最相关的字段会有更高的分数。
例如
<str name="defType">edismax</str>
<str name="qf">name last_name</str>
另一种方法是使用copyField将2个字段合并为1个字段,并且只在新创建的字段中搜索。
谢谢你们的快速回复,我很感激。
从解释查询中,我能够识别出实际上只在一个字段上执行了搜索。
我发现可以在同一个字段中添加多个字段进行搜索。在schema.xml中,我添加了以下内容:
<copyField source="last_name" dest="text"/>
现在,当使用多个搜索词时,结果会如预期一样出现。