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

发布于 2024-12-07 05:23:19 字数 1268 浏览 0 评论 0原文

我为 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:"score" 的含义?

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

I assign a custom "popularity" score for each document in my Solr database. I want search results to be ordered by this custom "score" field rather than the built-in relevancy score that is the default.

First I define my score field:

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

Then I rebuild the index, inserting a score for each document.
To run a query, I use something like this:

(text:hello)+_val_:"score"

Now I would expect the documents to come back sorted by the "score" field, but what I get instead is:

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

Notice that the scores come back out of order: 566, 41, 77, 0. The weird thing is that it only sorts this way with certain queries. I'm not sure what the pattern is, but so far I've only see the bad sorting when scores of "0" come back in the search results.

I've tried IntField instead of SortableIntField, and I've tried putting "sort=score desc" as a query parameter, with no change in behavior.

Am I doing something wrong, or just misunderstanding the meaning of using val:"score" in my query?

EDIT: I tried renaming the "score" field to "popularity" and got the same result.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

硪扪都還晓 2024-12-14 05:23:19

Score 字段由 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>

score field is used by Solr internally, so may be its not a good practice to define a field with the same field name.
you can try defining a field with different field name and both the options you mentioned should work fine.

Edit - This is what i have and works fine (Solr 3.3)

Schema -

Field Type -

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

Field -

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

Data -

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

Query -

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

Results :-

<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>
等待我真够勒 2024-12-14 05:23:19

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

因此,如果文档 A 上的流行度 = 41,文档 B 上的流行度 = 77,但文档 A 在关键字“hello”上的得分比 B 高出 36 分以上,那么它们将按 A 排在 B 之前。

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

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

The _val_ hack actually ADDS the "popularity" field to the normally computed score of solr.

So, if you have popularity=41 on document A and popularity=77 on document B, but document A scores more than 36 points better than B for the keyword "hello", then they'll get sorted with A before B.

Use the "sort" field (as you did) that completely overrides normal sorting by score.

An alternative way could be to use a filter query (parameter fq instead of q), that filters matching document without computing any score, and then use _val_ to define your scoring formula. Since with filter queries all retrieved documents will have a score of zero, _val_ would be unaffected and behave as you originally expected.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文