为什么 Solr 在更新字段后更改记录位置

问题描述

我是 Solr 的新手,在更新字段和执行搜索时遇到了一个奇怪的行为。

场景如下: 我的核心中有 300 条记录,我有一个搜索查询,其中我用这个过滤了结果

fq=IsSoldHidden:false AND IsDeleted:false AND StoreId:60 我按 DateInStock asc

对其进行排序

一切都完美地返回了我的预期结果, 这是我查询的前 3 个示例结果:

--------------------------------------------------------------------------------------
id    | Price   | IsSoldHidden | IsDeleted | StoreId | StockNo | DateInStock 
-------------------------------------------------------------------------------------- 
27236 | 15000.0 |   false      |  false    |    60   |  A00059 | 2021-06-07T00:00:00Z
-------------------------------------------------------------------------------------- 
37580 | 0.0     |   false      |  false    |    60   |  M9202  | 2021-06-08T00:00:00Z
-------------------------------------------------------------------------------------- 
37581 | 12000   |   false      |  false    |    60   |  M9173  | 2021-06-08T00:00:00Z

但是当我尝试更新(AtomicUpdate to be specific 2nd row 中的 Price 字段时,并再次触发具有相同过滤器要求的搜索,结果变成这样:

--------------------------------------------------------------------------------------
id    | Price   | IsSoldHidden | IsDeleted | StoreId | StockNo | DateInStock
-------------------------------------------------------------------------------------- 
27236 | 15000.0 |   false      |  false    |    60   |  A00059 | 2021-06-07T00:00:00Z
-------------------------------------------------------------------------------------- 
37581 | 0.0     |   false      |  false    |    60   |  M9173  | 2021-06-08T00:00:00
-------------------------------------------------------------------------------------- 
37582 | 0.0     |   false      |  false    |    60   |  M1236  | 2021-06-08T00:00:00Z

一个结果的第二行(37580)放在最后一行(文档#300)。

我在网上研究过,这是我发现的

Solr changes document's score when its random field value altered

但我认为情况与我不同,因为我没有将分数添加为 Sort。

我不知道为什么它会这样, 我错过了什么吗? 或者有没有人可以解释一下?

提前致谢。

解决方法

由于日期相同,它们的内部排序顺序取决于它们在索引中的位置。

更新文档将原始文档标记为已删除,并在索引末尾添加一个新文档,因此其在索引中的位置发生变化。

如果您想让它稳定,请改为按 dateid 排序 - 这样当日期相同时,较低的 id 将始终排在第一位,并且排序将是稳定。