2

我需要在按分数查看文档排序的 Solr 结果集中来回导航。为了形象化,首先将文档标题列表呈现给用户,然后他或她可以单击其中一个标题以查看更多详细信息,然后需要有机会移动到原始列表中的下一个文档而无需返回和单击另一个标题。

在查看文档期间更改:修改其动态字段(或创建尚不存在)以标记该文档已被查看(用于其他搜索)。

我面临的问题是,当文档被更改并重新索引以保留这些更改时,有时(但并非总是如此,这非常令人不安)它在相同查询的结果集中的位置会发生变化(换句话说,它的分数会发生变化因为在浏览按文档字段之一排序的结果时不会发生这种情况)。因此,“上一个”/“下一个”导航无法正常工作。

我没有在字段上使用任何自定义权重或助推器来计算分数。此外,在浏览期间更改的动态字段不参与用于浏览记录集的查询。

那么,问题是:对查询中未包含的文档字段的修改是否可以改变其相关性分数?如果可以,那我该如何控制呢?

更新

我做了一些测试,可以添加以下内容:

  1. 即使没有修改任何字段,文档也会更改其在结果集中的位置 - 只需请求文档并重新索引它而不对其字段进行任何更改,它就会在下次对同一索引执行相同查询时占据另一个位置。

  2. 即使结果集被显式排序(“first_name DESC”),也会发生这种情况,因此不涉及分数(取决于更新日期)。文档保持不变,其字段结果集排序依据相同,但其位置发生变化。

仍然不知道如何避免这种情况。

4

2 回答 2

2

在 Solr 中,如果您的字段被“索引”,它将对相关性排名产生影响(“存储”字段显示在搜索结果中,但不一定可搜索)。如果有问题的字段没有被标记为索引,那么你很高兴。请注意,“索引”和“存储”不一定相同,因此即使未显示所有字段(字段也可以“索引”而不是“存储”),您也会对结果列表的更改感到困惑。

在这种情况下,我认为您希望您的“查看”字段被“存储”而不是“索引”。如果您真的想控制查询,可以使用 copyField 将相关结果复制到单个可搜索字段中。您还可以提升术语或文档,以便某些字段对搜索查询“不太重要”。

如果您想查看相关性排名是如何计算的,您可以在 Solr 查询的末尾添加“debugQuery=on”(有关更多信息,请参阅相关性常见问题解答)。

然而,话虽如此,我建议您缓存您的搜索结果查询(至少在您的结果的第一页),因为您的结果总是会发生变化(添加的文档,被其他用户删除等)。最好的办法是设计一个可以预见这一点的 UI,或者至少对用户的查询进行批处理。

于 2011-06-06T17:57:49.987 回答
2

我找到了解决方案,它不能完全消除问题,但不太可能发生。

因此,当文档按某个字段排序并且该字段中有许多具有相同值的文档时,就会出现问题(例如,结果集按名字排序,“John”有 100 个条目)。

这是涉及索引时间的时候 - 显然 Solr 使用它来对主要排序字段相同的文档进行排序。为了降低这种情况可能性,您需要添加更多的排序字段,例如“first_name desc”应该变成“first_name desc, last_name desc, register_date asc”。

此外,将文档的唯一 ID 添加为最后一个排序字段应该可以完全解决问题(对于索引中的任何两个文档,排序字段的集合永远不会相同)。

于 2011-06-09T07:47:11.160 回答