本文介绍了集聚分组弹性搜索中的需要分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们正在应用聚合和分组,需要为此进行分页。
let body = {
size: item_per_page,
"query": {
"bool": {
"must": [{
"terms": {
"log_action_master_id": action_type
}
}, {
"match": {
[search_by]: searchParams.user_id
}
}, {
"match": {
"unit_id": searchParams.unit_id
}
},
{
"range": {
[search_date]: {
gte: from,
lte: to
}
}
}
]
}
},
"aggs": {
"group": {
"terms": {
"field": "id",
"size": item_per_page,
"order": { "_key": sortdirction }
},
},
"types_count": {
"value_count": {
"field": "id.keyword"
}
},
},
};
推荐答案
您可以使用以下选项:-
- Composite Aggregation:可以将多个数据源合并到一个存储桶中,并支持分页和排序。它只能使用AFTER_KEY进行线性分页,即不能从第1页跳到第3页。您可以获取"n"条记录,然后在KEY之后传递返回,并获取下一条"n"条记录。
GET index22/_search
{
"size": 0,
"aggs": {
"ValueCount": {
"value_count": {
"field": "id.keyword"
}
},
"pagination": {
"composite": {
"size": 2,
"sources": [
{
"TradeRef": {
"terms": {
"field": "id.keyword"
}
}
}
]
}
}
}
}
- Include partition:在查询时将字段的值分组到多个分区中,并且在每个请求中只处理一个分区。术语字段均匀分布在不同的分区中。所以你必须事先知道词条的数量。您可以使用cardinality aggregation获取计数
GET index22/_search
{
"size": 0,
"aggs": {
"TradeRef": {
"terms": {
"field": "id.keyword",
"include": {
"partition": 0,
"num_partitions": 3
}
}
}
}
}
- Bucket Sort aggregation:对其父级多Bucket集合的Bucket进行排序。每个存储桶可以基于其_key、_count或其子聚集来排序。它仅适用于从父聚合返回的存储桶。您需要将术语大小设置为10,000(最大值),并截断Bucket_Sort中的存储桶。您可以使用From和Size进行分页,就像在查询中一样。如果您的术语超过10,000个,您将无法使用它,因为它只从按术语返回的存储桶中进行选择。
GET index22/_search
{
"size": 0,
"aggs": {
"valueCount":{
"value_count": {
"field": "TradeRef.keyword"
}
},
"TradeRef": {
"terms": {
"field": "TradeRef.keyword",
"size": 10000
},
"aggs": {
"my_bucket": {
"bucket_sort": {
"sort": [
{
"_key": {
"order": "asc"
}
}
],
"from": 2,
"size": 1
}
}
}
}
}
}
就性能而言,复合聚合是更好的选择
这篇关于集聚分组弹性搜索中的需要分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!