我为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 :“得分”的含义?
编辑:我尝试将“得分”字段重命名为“受欢迎程度”并得到相同的结果。答案 0 :(得分:2)
得分字段,因此定义具有相同字段名称的字段可能不是一个好习惯。
您可以尝试定义具有不同字段名称的字段,并且您提到的两个选项都可以正常工作。
编辑 - 这就是我拥有并且工作正常(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_将不受影响,并且行为与您最初预期的一样。