1

我想知道如何为多个词条搜索结果获得不同的分数?

即使查询中有多个术语,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 Fisher”时,两个结果都出现了,但得分相同。我想要的是基于搜索词的相关性的不同分数。

这是以下查询的结果 http://localhost:8983/solr/select?q=john+fisher%0D%0A&rows=10&fl= *%2Cscore

<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>

任何帮助将不胜感激

4

3 回答 3

4

您最好的选择是了解和分析不同因素如何影响您的文档分数,Lucene 具有有用的功能Explanation,Solr 利用它来提供如何计算分数,您可以在 Solr 中使用“debugQuery”来查看它是如何得出的,

?q=john&fl=score,*&rows=2&debugQuery=on

前回应:

<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

阅读:

于 2012-01-25T19:05:35.470 回答
1

在我看来,您只是在“名称”字段上进行搜索。这就是为什么分数是一样的。如果您使用DisMax,您可以轻松地在这两个字段上进行搜索,并且最相关的将获得更高的分数。

例如

<str name="defType">edismax</str>
<str name="qf">name last_name</str>

另一种方法是使用 copyField 将 2 个字段合并为 1 个字段,并且仅在新创建的字段中搜索。

于 2012-01-26T12:17:34.537 回答
0

谢谢你们的快速回复,我很感激。

从解释查询中,我能够确定确实只在一个字段上执行了搜索。

我看到可以将多个字段添加到同一个字段进行搜索。在 schema.xml 我添加了以下内容:

<copyField source="last_name" dest="text"/>

当使用多个搜索词时,结果现在按预期出现。

于 2012-01-26T14:12:40.257 回答