【问题标题】:Displaying all aggregated results from Elasticsearch query in PHP在 PHP 中显示来自 Elasticsearch 查询的所有聚合结果
【发布时间】:2017-06-06 03:49:30
【问题描述】:

我有一个名为“arrivalDate”的字段,该字段是一个字符串。每个文档都有一个字符串格式的到达日期(例如:20110128)。我希望我的输出是这样的(日期和具有该日期的记录数):

日期:该日期有多少条记录

20110105:5 条记录

20120501:2 条记录

20120602:15 条记录

我已经有了获取这些结果的查询。

我正在尝试在 PHP 中显示来自 Elasticsearch 的聚合结果。我希望我的输出是这样的:

日期:该日期有多少条记录

20110105:5 条记录

20120501:2 条记录

20120602:15 条记录 这是我目前所拥有的:

    $json = '{"aggs": { "group_by_date": { "terms": { "field": "arrivalDate" } } } }';

        $params = [
            'index' => 'pickups',
            'type' => 'external',
            'body' => $json 
            ];

$results = $es->search($params);

但是,我不知道如何在 PHP 中显示结果。例如,如果我想显示文档总数,我会这样做 echo $results['hits']['total'] 我如何在 PHP 中显示所有日期以及它们在 PHP 中的记录数?

【问题讨论】:

  • 你的 $results 数组是什么样子的?
  • @Auris 如果我在 Kibana 中运行脚本,它包含所有信息。它包含命中、总数、示例文档以及一些文档的聚合
  • @Auris 这是数组的聚合部分,这只是一个 sn-p: [aggregations] => Array ( [group_by_date] => Array ( [doc_count_error_upper_bound] => 11058 [sum_other_doc_count] => 818008 [buckets] => 数组 ([0] => 数组 ([key] => 20160614 [doc_count] => 18462) ) ) ) )
  • 您可以尝试 Alex 的答案并在查询中执行此操作,但要从您的 sinpet php 访问数据看起来像:foreach($result['aggregations']['group_by_date']['group_by_date']['buckets'] as $entry) { echo $entry['key']; echo $entry['doc_count']; }

标签: php elasticsearch


【解决方案1】:

我建议以与构建查询相同的方式使用聚合,根据我的经验,它似乎工作得更快。请看下面的代码:

'aggs' => [
    'group_by_date' => [
        'terms' => [
            'field' => 'arrivalDate',
            'size' => 500
        ]
    ]
]

之后,您可以将点击部分切换为results['aggregations'],而不是使用典型的results['hits']['hits']。然后通过访问响应中的存储桶来访问返回的数据。

为了从上面显示的聚合中访问数据,可能是这样的:

foreach ($results as $result){
    foreach($result['buckets'] as $record){
        echo($record['key']);
    }
}

会有更好的方法来访问数组中的数组,但是,上面的循环系统对我来说效果很好。如果您在访问数据时遇到任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2021-08-28
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多