如何在Elasticsearch';s聚合&xFF1F;
我有一个elasticsearch请求,如下所示:如何在Elasticsearch';s聚合&xFF1F;,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我有一个elasticsearch请求,如下所示: { "size":0, "aggs":{ "group_by_state":{ "terms":{ "field":"poi_id" }, "aggs":{ "sum(price)":{ "sum":{
{
"size":0,
"aggs":{
"group_by_state":{
"terms":{
"field":"poi_id"
},
"aggs":{
"sum(price)":{
"sum":{
"field":"price"
}
}
}
}
}
}
我想在这个请求中添加分页,就像
select poi_id, sum(price) from table group by poi_id limit 0,2
我搜索了很多,找到了一个关于它的链接:
但是我仍然没有得到实现方法
有没有办法通过Elasticsearch本身而不是我的应用程序来实现它?您可以使用请求中的参数和大小。有关更多信息,请参阅。您的请求如下:
{
"from" : 0,
"size" : 10,
"aggs":{
"group_by_state":{
"terms":{
"field":"poi_id"
},
"aggs":{
"sum(price)":{
"sum":{
"field":"price"
}
}
}
}
}
}
我目前正在研究分页聚合结果的解决方案。您要使用的是
分区
。官方文件中的这一部分非常有用。
为了适应您的示例,将更新术语
设置,如下所示
{
"size":0,
"aggs":{
"group_by_state":{
"terms":{
"field":"poi_id",
"include": {
"partition": 0,
"num_of_partitions": 100
},
"size": 10000
},
"aggs":{
"sum(price)":{
"sum":{
"field":"price"
}
}
}
}
}
}
这将把你的结果分成100个分区(num\u of\u partitions
),每个分区的最大结果大小为10k(size
),并检索第一个这样的分区(partition:0
)
如果要聚合的字段的唯一值超过10k(并希望返回所有值),则需要增加大小
值,或者根据字段的基数动态计算大小
和分区数
。
您可能还希望使用show\u term\u doc\u count\u error
设置来确保聚合返回准确的计数
希望这会有所帮助。晚会迟到了,但刚刚在v6.3+中发现聚合。这些允许:
1.更“类似Sql”的分组
2.使用“after_键”分页
拯救了我们的一天,希望它也能帮助别人 例如,获取两个日期之间每小时的点击数,按5个字段分组:
GET myindex-idx/_search
{
"query": {
"bool": {
"must": [
{"match": {"docType": "myDOcType"}},
{"range": {
"@date": {"gte": "2019-06-19T21:00:00", "lt": "2019-06-19T22:00:00"}
}
}
]
}
},
"size": 0,
"aggs": {
"mybuckets": {
"composite": {
"size": 100,
"sources": [
{"@date": {
"date_histogram": {
"field": "@date",
"interval": "hour",
"format": "date_hour"}
}
},
{"field_1": {"terms": {"field": "field_1"}}},
{"field_2": {"terms": {"field": "field_2"}}},
{"field_3": {"terms": {"field": "field_3"}}},
{"field_4": {"terms": {"field": "field_4"}}},
{"field_5": {"terms": {"field": "field_5"}}}
]
}
}
}
}
产生:
{
"took": 255,
"timed_out": false,
"_shards": {
"total": 80,
"successful": 80,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 46989,
"max_score": 0,
"hits": []
},
"aggregations": {
"mybuckets": {
"after_key": {
"@date": "2019-06-19T21",
"field_1": 262,
"field_2": 347,
"field_3": 945,
"field_4": 2258,
"field_5": 0
},
"buckets": [
{
"key": {
"@date": "2019-06-19T21",
"field_1": 56,
"field_2": 106,
"field_3": 13224,
"field_4": 46239,
"field_5": 0
},
"doc_count": 3
},
{
"key": {
"@date": "2019-06-19T21",
"field_1": 56,
"field_2": 106,
"field_3": 32338,
"field_4": 76919,
"field_5": 0
},
"doc_count": 2
},
....
下面是这样发出的分页查询,使用“查询中的after_key对象”after对象:
GET myindex-idx/_search
{
"query": {
"bool": {
"must": [
{"match": {"docType": "myDOcType"}},
{"range": {
"@date": {"gte": "2019-06-19T21:00:00", "lt": "2019-06-19T22:00:00"}
}
}
]
}
},
"size": 0,
"aggs": {
"mybuckets": {
"composite": {
"size": 100,
"sources": [
{"@date": {
"date_histogram": {
"field": "@date",
"interval": "hour",
"format": "date_hour"}
}
},
{"field_1": {"terms": {"field": "field_1"}}},
{"field_2": {"terms": {"field": "field_2"}}},
{"field_3": {"terms": {"field": "field_3"}}},
{"field_4": {"terms": {"field": "field_4"}}},
{"field_5": {"terms": {"field": "field_5"}}}
],
"after": {
"@date": "2019-06-19T21",
"field_1": 262,
"field_2": 347,
"field_3": 945,
"field_4": 2258,
"field_5": 0
}
}
}
}
}
这将遍历结果,直到MyBucket返回空值为止,它似乎从和大小不适用于聚合。我在聚合请求中添加了一个from:0和size:1,elasticsearch返回三个bucket。好的,我查看了它,size参数必须在“field”下面:“price”参数。但在elasticsearch中,聚合中的分页似乎不受支持。例如,有几个stackoverflow线程-在实际es版本中,它似乎是相同的…分页在聚合中不起作用。阅读你能不能也加一个例子来帮助解决原来问题中的问题