2011-06-06 25 views
2

我需要先逐一浏览按比例查看文档排序的Solr结果集。为了形象化,首先向用户呈现文档标题列表,然后他或她可以单击标题中的一个以查看更多细节,然后需要有机会移动到原始列表中的下一个文档而无需返回并且点击另一个标题。Solr在其随机字段值更改时更改文档的分数

在查看文档时发生变化:其动态字段被修改(或者创建不存在)以标记该文档已被查看(用于其他搜索)。

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

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

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

UPDATE

我做了一些测试,并可以添加以下内容:如果没有字段被修改的结果甚至设立

  1. 文档的更改它的地方 - 只是请求文件并重新对其字段进行索引而不对其字段进行任何更改,这会在下次执行同一索引时执行相同的查询时发生。

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

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

回答

2

我发现这个解决方案并没有完全消除问题,但使其发生的可能性小得多。

因此,当文档按字段排序并且其中一些字段在此字段中具有相同值时(例如,结果集按名排序,并且“约翰”有100个条目),问题就会发生。 。

这是索引时间涉及 - 显然Solr使用它来排序文件,当他们的主要排序字段是相同的。为了制造这种情况,你需要添加更多的排序字段,例如很多。 “first_name desc”应该成为“first_name desc,last_name desc,register_date asc”。

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

2

在Solr中,如果您的字段被“编入索引”,它将影响相关性排名(“存储”字段显示在搜索结果中,但不一定可搜索)。如果有问题的字段没有标记为索引,那么你很好。请注意,“索引”和“存储”不一定是相同的,因此即使并非所有字段都显示(字段可以“索引”而不是“存储”),您仍然对结果列表发生变化感到困惑。

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

如果您想了解如何计算相关性排名,可以在Solr查询结尾添加“debugQuery = on”(有关更多信息,请参阅Relevancy FAQ)。因此,我会建议你缓存你的搜索结果查询(至少对于你的结果的第一页),因为你总是会有结果改变(文档添加,被其他用户删除等) 。你最好的选择是设计一个预测这个UI的UI,或者至少批量用户的查询。

+1

谢谢,出于某种原因,我确信对参与查询的字段所做的更改不会影响计算得分。 在我的情况下,有必要将此字段编入索引,因为还有另一个查询,我需要过滤仅查看或仅查看过的文档。缓存也不适合,因为用户应该浏览整个结果集,而不仅仅是通过页面(好吧,缓存仍然可行,老实说在资源方面可以忍受,但不够优雅)。 我会尽量提高搜索字段并告诉它是否有效。 – Yuriy 2011-06-07 07:45:07

+0

只是注意到,当结果按照其他字段而不是分数排序时也会发生。这怎么可能?我想如果指定了排序并且明确地没有分数(比如,排序就像“first_name DESC”),它不会影响排序。但是,它似乎确实如此。我怎样才能摆脱这一点? – Yuriy 2011-06-08 14:11:18

+0

好吧,看起来像提升作品,但没有效果。如果我提高搜索的领域,所有的比赛都会得到同样的提升,而且最近重新编制索引的文件仍然会在相关性上产生一些差异,从而产生差异。应该有一种方法可以从排序中完全排除上次更新的日期,但是我找不到它... – Yuriy 2011-06-08 14:50:22