从QueryContainer删除重复的UserID(字段)

时间:2018-07-09 08:42:06

标签: c# elasticsearch nest

我在弹性搜索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)
            );

1 个答案:

答案 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)
            )
        )
    );
}