我在弹性搜索C#中遇到某些查询问题。
我有这个QueryContainer,它带有一个内部QueryDescriptor和很多内部QueryContainers \ QueryDescriptors,
但是一个主QueryContainer => this._QueryContainer
包含所有数据。
问题是this._QueryContainer
中的UserID字段不是唯一的,所以当我返回20个唯一用户时,第一次都可以,但是接下来的20个用户(对于下一页)我不知道在哪里开始this.From
...
因为this._QueryContainer
具有重复项,但由于聚合而返回唯一。所以有冲突。
有没有一种方法可以使查询从一开始就与众不同?
results = Client.Search<Users>(s => s
.From(this.From)
.Query(this._QueryContainer)
.Aggregations(a => a
.Terms("unique", te => te
.Field(p => p.UserID)
)
)
.Size(20)
);
答案 0 :(得分:1)
查询中的.From()
和.Size()
不会影响您拥有的Terms
聚合,它们仅适用于.Query()
部分,并从中返回匹配。
如果您需要从“条款”汇总中返回很多值,这是我想做的,您可以
1。Use partitioning来过滤值,例如在多个请求中返回大量术语。
var response = client.Search<Users>(s => s
.Aggregations(a => a
.Terms("unique", st => st
.Field(p => p.UserID)
.Include(partition: 0, numberOfPartitions: 10)
.Size(10000)
)
)
);
// get the next partition
response = client.Search<Users>(s => s
.Aggregations(a => a
.Terms("unique", st => st
.Field(p => p.UserID)
.Include(partition: 1, numberOfPartitions: 10)
.Size(10000)
)
)
);
2。Use a Composite Aggregation with a Terms value source
var response = client.Search<Users>(s => s
.Aggregations(a => a
.Composite("composite", c => c
.Sources(so => so
.Terms("unique", st => st
.Field(p => p.UserID)
)
)
)
)
);
// the following would be in a loop, to get all terms
var lastBucket = response.Aggregations.Composite("composite").Buckets.LastOrDefault();
if (lastBucket != null)
{
// get next set of terms
response = client.Search<Users>(s => s
.Aggregations(a => a
.Composite("composite", c => c
.Sources(so => so
.Terms("unique", st => st
.Field(p => p.UserID)
)
)
.After(lastBucket.Key)
)
)
);
}