为啥 Solr 在更新字段后会更改记录位置

Posted

技术标签:

【中文标题】为啥 Solr 在更新字段后会更改记录位置【英文标题】:Why does Solr changes record position after updating a field为什么 Solr 在更新字段后会更改记录位置 【发布时间】:2021-08-27 04:40:57 【问题描述】:

我是 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 具体第二行中的 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)被放在最后一行(document#300)。

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

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

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

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

提前致谢。

【问题讨论】:

由于您没有在返回的条目中包含实际日期,因此很难说 - 但日期是否相同?在这种情况下,将使用 Lucene 中的内部文档顺序,并且由于更新实际上是删除 + 插入,因此新文档将附加到索引的末尾。也很难说 37580 是否包含在您示例的结果中。 @MatsLindh,嗨,我更新了我的帖子并包含了日期。而且我还在使用原子更新来更新价格字段。 【参考方案1】:

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

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

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

【讨论】:

以上是关于为啥 Solr 在更新字段后会更改记录位置的主要内容,如果未能解决你的问题,请参考以下文章

在oracle数据库表中没有添加rowid字段为啥会出现

为啥在完成块中更改 .text 字段时 UITextField 和 UILabel 不更新?

是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?

架构更改是不是需要重新索引所有 Solr 文档或仅包含已更改架构字段的文档?

Redmine自定义字段增多后会变慢

向 Solr 核心添加字段时,为啥会出现“ManagedIndexSchema Error persisting managed schema => FileNotFoundException: