将聚合结果插入索引

Posted

技术标签:

【中文标题】将聚合结果插入索引【英文标题】:Insert aggregation results into an index 【发布时间】:2016-07-30 01:30:49 【问题描述】:

目标是建立一个仅包含相关文档组中最新文档的 Elasticsearch 索引,以跟踪某些监控计数器和状态的当前状态。

我制作了一个简单的 Elasticsearch 聚合查询


  "size": 0,
  "aggs": 
    "group_by_monitor": 
      "terms": 
        "field": "monitor_name"
      ,
      "aggs": 
        "get_latest": 
          "top_hits": 
            "size": 1,
            "sort": [
              
                "timestamp": 
                  "order": "desc"
                
              
            ]
          
        
      
    
  

它将相关文档分组到桶中,并为每个桶选择最近的文档。

以下是我完成工作所必须的不同想法:

    直接使用聚合查询将结果推送到索引中,但是好像不太可能:Is it possible to put the results of an ElasticSearch aggregation back into the index? 使用 Logstash Elasticsearch input plugin 执行聚合查询和 Elasticsearch output plugin 推入索引,但似乎输入插件只查看 hits 字段并且无法处理聚合结果:Aggregation Query possible input ES plugin! 使用 Logstash http_poller plugin 获取 JSON 文档,但它似乎不允许为 HTTP 请求指定正文! 使用 Logstash exec plugin 执行 cURL 命令来获取 JSON,但这似乎很麻烦,我不得已。 使用NEST API 构建一个基本应用程序,该应用程序将执行轮询、提取结果、清理它们并将生成的文档注入目标索引,但我想避免添加新工具来维护。

有没有相当复杂的方法来完成这个?

【问题讨论】:

Watcher? @AndreiStefan 谢谢,但 AFAIK Watcher 对这个用例没有帮助。此外,我们还没有(还没有?)在我们的基础设施上部署它。对于警报,我们使用 ElastAlert,它也可以完美地完成这项工作。 我不是建议 Watcher 进行警报,而是为了能够定期query the indices,对结果数据执行一些basic transformation 并能够index back into Elasticsearch。 @AndreiStefan 感谢这些元素。事实上,Watcher 似乎是一个不错的选择。但正如之前所说,我们还没有它。 :'( @OvidiuRudi 不是直接的方法,我必须用 C# 构建一个专门的程序来制作管道。 【参考方案1】:

编辑logstash.conf文件如下

input 
  elasticsearch 
    hosts => "localhost" 
    index => "source_index_name" 
    type =>"index_type" 
    query => 'Query' 
    size => 500 
    scroll => "5m" 
    docinfo => true
  


output  
  elasticsearch  
    index => "target_index_name" 
    document_id => "%[@metadata][_id]"
  

【讨论】:

由于修复了 Logstash,它现在可以工作了吗?因为在提出问题的时候 Logstash 没有处理聚合。 是的,它的工作我昨天只在 ELK(5.1.1) 上尝试过 好的,我相信你,你会得到我的 +1。 :) 我不明白你的回答。我已经在使用 logstash 5.6.1 的弹性搜索 5.1.1 上对其进行了测试,但它不起作用。你在哪里告诉 logstash 使用聚合结果而不是“命中”数组? @AkshayPatil 不是弹性搜索版本的问题。正如您从源代码linklogstash 中看到的那样,只需滚动 hits 数组,因此无法从弹性搜索中读取聚合,它们放置在 aggregations 数组中在查询的响应中。您发布的配置只需复制每个文档即可抱怨从 source_index_name 到 target_index_name 的查询,因此它完全忽略了聚合值。

以上是关于将聚合结果插入索引的主要内容,如果未能解决你的问题,请参考以下文章

聚合结果的 Elasticsearch 过滤器(用于搜索和聚合)

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

ES 聚合索引简介

MySQL 数据库聚合查询和联合查询操作

MySQL 数据库聚合查询和联合查询操作

如何对聚合进行过滤以有效地使用索引?