gpt4 book ai didi

elasticsearch - 获取最新的文档版本并汇总结果

转载 作者:行者123 更新时间:2023-12-03 00:59:49 28 4
gpt4 key购买 nike

我的索引包含很多文档,每个文档都有多个版本,例如:

{"doc_id": 13,
"version": 1,
"text": "bar"}

{"doc_id": 13,
"version": 2,
"text": "bar"}

{"doc_id": 13,
"version": 3,
"text": "bar"}

{"doc_id": 14,
"version": 1,
"text": "foo"}

{"doc_id": 14,
"version": 2,
"text": "bar"}

我想获取每个文档的最新版本,并使用 terms聚合对其进行汇总(最新版本)。
我尝试使用 top hits检索最新版本:
{"size" :0,
"aggs" : {
"doc_id_groups" : {
"terms" : {
"field" : "doc_id",
"size" : "0"
},
"aggs" : {
"docs" : {
"top_hits" : {
"size" : 1,
"sort" : {
"version" : {
"order" : "desc"
}
}
}
}
}
}
}
}

但是我无法进行聚合,因为 top hits不支持子聚合。
我猜想检索id然后将其聚合对于客户端来说将是非常繁重的操作。
脚本编写可能会有所帮助吗?

更新:我忘记提及的一件事:在汇总文档之前按时间范围进行过滤,因此我们不知道哪个版本在索引时间是最新的,仅在搜索时

最佳答案

chat中提供的样本和其他详细信息中,我认为您无法使用聚合来获得所需的结果。但是我可以提出一个替代解决方案:

  • 添加 bool(boolean) 类型的属性“当前”,其中
    对于所有最新版本的文档,将设置为true。如果
    插入了新版本-“当前”将设置为false
    在较旧的版本中设置为true,在较新的版本中设置为true。
  • 添加属性“时间点”,它将包含多个值。在一天结束时(可以使用任何其他时间段)
    当前记录添加当前时间戳(或
    期间,例如“09.30.2016”或“Jan”)添加到“时间点
    数组。

  • 优点:
  • 您可以在某个时间点轻松地检索当前记录,只需检查时间点是否在“ timepoints ”数组中即可。
  • 您可以通过一次查询从所有文档中检索所有可用时间点。
  • 您可以按时间点进行汇总,例如计算每个时间点的所有记录。
  • 无需维护多个索引,记录的重复等,该算法非常简单。

  • 缺点:
  • 在任意时间点都不可能获得当前版本,只是执行计算时的版本。
  • 如果您过于频繁地运行计算并且有数百万条记录,则“时间点”数组的整体大小可能会显着增加。

  • 解决方法:
  • 要获得更精细的统计信息,请每小时进行一次计算。但是每天(或每月或每年)从“ timepoints ”数组中删除一些时间点,时间较长。最后,您将有一组时间点,分别对应于每年(如果是一年多以前),每个月(如果是一个月以上),每天(如果是超过一天之前),以及最近一段时间的每小时。当然,可以根据需要改进删除时间点的算法。
  • 如果您主要使用记录的最新版本-将它们存储在单独的索引中,则将旧版本存储在另一个索引中。在这种情况下,您甚至不需要“当前”属性,只需遍历当前索引中的所有记录并添加时间戳即可。

  • 如果需要,我可以为您提供上述步骤所需的所有查询。

    关于elasticsearch - 获取最新的文档版本并汇总结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649429/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com