我需要在分数查看文档中逐个排序的Solr结果集中前后导航。为了使其可视化,首先向用户呈现文档标题列表,然后他或她可以单击标题之一以查看更多细节,然后需要有机会移动到原始列表中的下一个文档而不返回点击另一个标题。
在查看文档时更改:修改(或创建尚未存在)动态字段以标记该文档已被查看(在其他搜索中使用)。
我面临的问题是,当文档被更改并重新编入索引以保留这些更改时,有时(并不总是,这非常令人不安)它在同一查询的结果集中的位置发生了变化(换句话说,它的分数会发生变化,因为浏览按其中一个文档字段排序的结果时不会发生这种情况。因此,“上一个”/“下一个”导航无法正常工作。
我没有在字段上使用任何自定义加权或助推器来进行分数计算。此外,在浏览期间更改的动态字段不参与用于获取浏览记录集的查询。
因此,问题是:查询中未包含的文档字段的修改是否会改变其相关性得分?如果可以,那我该如何控制呢?
更新
我做了一些测试,可以添加以下内容:
即使没有修改字段,文档也会更改其在结果集中的位置 - 只需要请求文档并重新编制索引而不对其字段进行任何更改,这样下次在同一索引上执行相同查询时就会占用另一个位置执行。
即使结果集已明确排序(“first_name DESC”),也会发生这种情况,因此不涉及得分(取决于更新日期)。文档保持不变,其字段结果集的排序方式相同,但其位置发生变化。
仍然不知道如何避免这种情况。
答案 0 :(得分:2)
在Solr中,如果您的字段被“编入索引”,则会对相关性排名产生影响(“存储”字段显示在搜索结果中,但不一定是可搜索的)。如果有问题的字段没有标记为索引,那么你很高兴。请注意,“索引”和“存储”不一定相同,因此即使不显示所有字段,您也会对结果列表的更改产生混淆(字段可以“索引”而不是“存储”)。
在这种情况下,我认为您希望“已查看”字段“存储”但不“索引”。如果您确实想要控制查询,可以使用copyField将相关结果复制到单个可搜索字段中。您还可以boost terms或文档,以便某些字段对搜索查询“不太重要”。
如果您想了解如何计算相关性排名,可以在Solr查询的末尾添加“debugQuery = on”(有关详细信息,请参阅Relevancy FAQ)。
但是,尽管如此,我建议您缓存搜索结果查询(至少在结果的第一页),因为您将始终更改结果(添加文档,由其他用户删除等)。您最好的办法是设计一个预测到这一点的UI,或者至少批量用户的查询。
答案 1 :(得分:2)
我找到的解决方案并没有完全消除问题,但却不太可能发生。
因此,当文档按某个字段排序时会出现问题,并且在该字段中有许多字段具有相同的值(例如,结果集按名字排序,“John”有100个条目)。
这是索引时间涉及的时候 - 显然Solr在主要排序字段相同时使用它来对文档进行排序。要使此案例多不太可能,您需要添加更多排序字段,例如“first_name desc”应该变为“first_name desc,last_name desc,register_date asc”。
此外,添加文档的唯一ID作为最后一个排序字段应该完全消除问题(对于索引中的任何两个文档,排序字段集将永远不会相同)。