Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Elasticsearch';s聚合&xFF1F; - Fatal编程技术网

如何在Elasticsearch';s聚合&xFF1F;

如何在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":{

我有一个elasticsearch请求,如下所示:

{
    "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版本中,它似乎是相同的…分页在聚合中不起作用。阅读你能不能也加一个例子来帮助解决原来问题中的问题