我需要在Solr结果集中来回导航,按分数顺序逐个查看文档。为了可视化,首先向用户显示文档标题列表,然后他或她可以单击其中一个标题查看更多详细信息,然后需要有机会移动到原始列表中的下一个文档,而无需返回并单击另一个标题。
在查看文档的过程中,文档会发生更改:它们的动态字段会被修改(或创建的字段尚未存在),以标记该文档已被查看(用于其他搜索)。
我面临的问题是,当文档被更改并重新编制索引以保持这些更改时,有时(并非总是如此,这非常令人不安)它在相同查询的结果集中的位置会发生变化(换句话说,它的分数会发生变化,因为在浏览按文档字段排序的结果时不会发生这种情况)。因此,"上一个"/"下一个"导航无法正常工作。
我没有使用任何自定义权重或字段上的助推器来计算分数。此外,在浏览过程中更改的动态字段不参与用于浏览记录集的查询。
因此,问题是:对查询中未包含的文档字段的修改会改变其相关性得分吗?如果可以的话,我该如何控制呢?
更新
我做了一些测试,可以添加以下内容:
-
即使没有字段被修改,文档也会更改其在结果集中的位置——只需请求文档并重新索引,而不对其字段进行任何更改,就可以在下次对同一索引执行相同查询时将其置于另一个位置。
-
即使结果集是显式排序的("first_name DESC"),也会发生这种情况,因此不涉及分数(取决于更新日期)。文档保持不变,其字段结果集的排序方式相同,但其位置发生了变化。
仍然不知道如何避免这种情况。
在Solr中,如果您的字段被"索引",它将对相关性排名产生影响("存储"字段显示在搜索结果中,但不一定可搜索)。如果有问题的字段没有标记为索引,那么您可以继续。请注意,"已索引"one_answers"已存储"不一定相同,因此即使没有显示所有字段(字段也可以是"已索引的"而不是"已存储的"),您也会对结果列表的变化感到困惑。
在这种情况下,我认为您希望您的"已查看"字段是"存储的",而不是"索引的"。如果您真的想控制查询,可以使用copyField将相关结果复制到一个可搜索的字段中。您还可以增强术语或文档,使某些字段对搜索查询"不那么重要"。
如果你想了解相关性排名是如何计算的,你可以在Solr查询的末尾添加"debugQuery=on"(更多信息,请参阅相关性常见问题解答)。
不过,话虽如此,我建议您缓存搜索结果查询(至少在搜索结果的第一页),因为您总是会更改结果(其他用户添加、删除文档等)。您最好的选择是设计一个能够预见这一点的UI,或者至少对用户的查询进行批处理。
我找到了一个解决方案,它不能完全消除问题,但会大大降低问题发生的可能性。
因此,当文档按某个字段排序,并且该字段中有许多具有相同值的文档时,就会出现问题(例如,结果集按名字排序,"John"有100个条目)。
这是涉及索引时间的时候——显然,当文档的主要排序字段相同时,Solr会使用索引时间对文档进行排序。为了减少这种情况发生的可能性,您需要添加更多的排序字段,例如"first_name desc"应变为"first_name desc,last_name desc,register_date asc"。
此外,添加文档的唯一id作为最后一个排序字段应该可以完全消除问题(索引中的任何两个文档的排序字段集都不会相同)。