我正在尝试对类似于 the example 的聚合进行分区在 ElasticSearch 文档中,但没有让示例工作。
索引填充了事件类型:
public class Event
{
public int EventId { get; set; }
public string SegmentId { get; set; }
public DateTime Timestamp { get; set; }
}
EventId
是唯一的,每个事件都属于特定的 SegmentId
.每个 SegmentId 可以与零到多个事件相关联。问题是:
如何获取最新的
EventId
对于每个 SegmentId
?我预计独特片段的数量将在 1000 万个范围内,独特事件的数量会大一到两个数量级。这就是为什么我不认为使用
top_hits
单独使用是合适的,如 suggested here .因此,分区。示例:
我设置了一个演示索引,其中包含 1313 个文档(唯一
EventId
),属于 101 个不同的 SegmentId
(即每段 13 个事件)。我希望下面的查询能够工作,但无论 partition
是哪个,都会返回完全相同的结果。我指定的号码。POST /demo/_search
{
"size": 0,
"aggs": {
"segments": {
"terms": {
"field": "segmentId",
"size": 15, <-- I want 15 segments from each query
"include": {
"partition": 0, <-- Trying to retrieve the first partition
"num_partitions": 7 <-- Expecting 7 partitions (7*15 > 101 segments)
}
},
"aggs": {
"latest": {
"top_hits": {
"size": 1,
"_source": [
"timestamp",
"eventId",
"segmentId"
],
"sort": {
"timestamp": "desc"
}
}
}
}
}
}
}
如果我删除
include
并设置size
值大于 101,我得到每个段的最新事件。但是,我怀疑这是一个拥有一百万桶的好方法......
最佳答案
您正在尝试执行 Scroll的聚合。
Scroll API 仅支持搜索查询,不支持聚合。如果您不想使用 Top Hits,正如您所说,由于大量文档,您可以尝试:
关于elasticsearch - 使用组对聚合进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43370197/