在Solr中按自定义分数排序不会一致排序

时间:2011-09-28 20:07:20

标签: search sorting solr

我为Solr数据库中的每个文档分配了一个自定义的“流行度”分数。我希望搜索结果按此自定义“得分”字段排序,而不是默认的内置相关性得分。

首先我定义我的得分字段:

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
<field name="score" type="sint" stored="true" multiValued="false" />

然后我重建索引,为每个文档插入一个分数。 要运行查询,我使用以下内容:

(text:hello)+_val_:"score"

现在我希望文档按“得分”字段排序,但我得到的是:

<doc>
  <int name="score">566</int>
  <str name="text">SF - You lost me at hello...</str>
</doc>
<doc>
  <int name="score">41</int>
  <str name="text">hello</str>
</doc>
<doc>
  <int name="score">77</int>
  <str name="text">
    CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM
  </str>
</doc>
<doc>
  <int name="score">0</int>
  <str name="text">Hello Hello Hello</str>
</doc>

请注意,分数不按顺序返回:566,41,77,0。奇怪的是它只能通过某些查询对此进行排序。我不确定模式是什么,但到目前为止,我只看到在搜索结果中得分为“0”的错误排序。

我尝试过IntField而不是SortableIntField,我尝试将“sort = score desc”作为查询参数,但行为没有变化。

我做错了什么,或只是误解了在我的查询中使用 val :“得分”的含义?

编辑:我尝试将“得分”字段重命名为“受欢迎程度”并得到相同的结果。

2 个答案:

答案 0 :(得分:2)

Solr内部使用

得分字段,因此定义具有相同字段名称的字段可能不是一个好习惯。
您可以尝试定义具有不同字段名称的字段,并且您提到的两个选项都可以正常工作。

编辑 - 这就是我拥有并且工作正常(Solr 3.3)

架构 -

字段类型 -

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>

字段 -

<field name="popularity" type="int" indexed="true" stored="true" />

数据 -

<add>
    <doc>
      <field name="id">1007WFP</field>
      <field name="popularity">566</field>
      <field name="text">SF - You lost me at hello...</field>
    </doc>
    <doc>
      <field name="id">2007WFP</field>
      <field name="popularity">41</field>
      <field name="text">hello</field>
    </doc>
    <doc>
      <field name="id">3007WFP</field>
      <field name="popularity">77</field>
      <field name="text">
        CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM
      </field>
    </doc>
    <doc>
      <field name="id">4007WFP</field>
      <field name="popularity">0</field>
      <field name="text">Hello Hello Hello</field>
    </doc>
</add>

查询 -

http://localhost:8983/solr/select?q=*:*&sort=popularity%20desc

结果: -

<result name="response" numFound="4" start="0">
  <doc>
    <str name="id">1007WFP</str>
    <int name="popularity">566</int>
  </doc>

  <doc>
    <str name="id">3007WFP</str>
    <int name="popularity">77</int>
  </doc>
  <doc>
    <str name="id">2007WFP</str>
    <int name="popularity">41</int>

  </doc>
  <doc>
    <str name="id">4007WFP</str>
    <int name="popularity">0</int>
  </doc>
</result>

答案 1 :(得分:0)

_val_ hack实际上将“流行度”字段添加到正常计算的solr分数中。

因此,如果文档A上的流行度= 41,文档B上的流行度= 77,但是对于关键字“hello”,文档A的得分比B好36个以上,那么它们将在B之前用A排序

使用“排序”字段(正如您所做的那样)完全覆盖按分数进行的正常排序。

另一种方法可以是使用过滤器查询(参数fq而不是q),过滤匹配的文档而不计算任何分数,然后使用_val_来定义您的评分公式。由于使用过滤器查询,所有检索到的文档的得分均为零,_val_将不受影响,并且行为与您最初预期的一样。