加载核心后,在Solr中仅保留每个id的最新文档

时间:2016-03-30 15:09:31

标签: solr lucene

我有以下文件:

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

我的唯一键是“id”字段,“pos”是每个加载文档的计数器 出于性能原因,我想加载核心ASAP并避免在加载过程中删除(使用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}

所以我可以删除它们。

1 个答案:

答案 0 :(得分:0)

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

我会使用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 文档,并在展开部分中删除所有要删除的文档。请注意,展开的部分仅包含主要结果部分中显示的ID的文档。因此,您需要足够大的行数或正确的分页才能获得所有结果。