我有以下文件:
{
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}
所以我可以删除它们。
答案 0 :(得分:0)
我不知道以这种分组方式删除的方法。但是,可以使用查询来识别位置小于最大值的重复文档。
我会使用Result Grouping或Result 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的文档。因此,您需要足够大的行数或正确的分页才能获得所有结果。