【问题标题】:Keep only the latest document per id in Solr after loading core加载核心后,在 Solr 中仅保留每个 id 的最新文档
【发布时间】:2016-04-02 06:57:50
【问题描述】:

我有如下文件:

{
  id: X
  pos: y
  fields....
}

我的唯一键是“id”字段,“pos”是每个加载的文档都会增加的计数器。
出于性能原因,我想尽快加载核心并避免在加载期间删除(使用 overwrite=true 会导致索引吞吐量下降 33%)。
有没有一种简单的方法可以在完成加载核心后要求 Solr 删除具有相同“id”字段的所有文档,而只保留具有最新“pos”字段的文档(在每个唯一的“id”组中)?
如果有更好的技术可以在不处理删除的情况下提高加载速度,我将很乐意了解。 如果我需要手动删除它们,我正在寻找以下文档的查询:

{id:1 pos:0}
{id:1 pos:1}
{id:1 pos:2}
{id:2 pos:3}
{id:2 pos:4}

将返回:

{id:1 pos:0}
{id:1 pos:1}
{id:2 pos:3}

所以我可以删除它们。

【问题讨论】:

  • 您的索引如何?在点击 Solr 之前,重复删除可能更有效。您可能必须在索引完成后实现自定义删除脚本才能获得您所要求的其他内容。
  • 我正在使用 solrj 客户端进行索引。在建立索引之前删除重复项是不可能的,但如果有帮助,我确实知道何时遇到更新。 @MatsLindh

标签: solr lucene


【解决方案1】:

我不知道以这种分组方式进行删除的任何方法。但是,可以通过查询来识别位置小于最大值的重复文档。

我会使用Result GroupingResult Collapsing/Expanding

使用结果分组,查询参数看起来像:

"q":"*:*"
"group":"true"
"group.field":"id",
"group.sort":"pos desc"
"group.limit":"1000"
"group.offset":"1"

排序和偏移结合起来排除每个 id 值的顶部(最高 pos)文档。这假设 pos 字段被索引为某种数字。

使用折叠/展开,查询参数可以改为:

"q": "*:*"
"fq": "{!collapse field=id max=pos}"
"expand": "true"

这会将每个 id 的顶部 pos 文档放在主要结果正文中,并将所有要删除的文档放在 expanded 部分中。请注意,扩展部分将仅包含出现在主要结果部分中的 id 文档。因此,您需要足够大的行数或适当的分页来获得所有结果。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2012-07-19
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多