健美js:桶过滤器聚合

时间:2019-10-21 14:06:59

标签: elasticsearch bodybuilder.js

我想基于字段中的关键字出现次数创建存储桶。

我查看了elasticsearch文档,发现Filters Aggregation应该很合适: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html#search-aggregations-bucket-filters-aggregation

当前,我们正在使用bodybuilder.js来构建查询。我在源代码(https://github.com/danpaz/bodybuilder/blob/master/src/aggregation-builder.js#L87)中发现了一个未记录的函数:

bodybuilder()
     .aggregation('terms', 'title', {
         _meta: { color: 'blue' }
         }, 'titles')
        .build()

产生的结果:

{
  "aggs": {
    "titles": {
      "terms": {
        "field": "title"
      },
      "meta": {
        "color": "blue"
      }
    }
  }
}

但这实际上与ES文档中描述的结构不同:

GET logs/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "filters" : [
          { "match" : { "body" : "error"   }},
          { "match" : { "body" : "warning" }}
        ]
      }
    }
  }
}

有什么想法如何使用bodybuilder.js实现过滤器聚合吗?

1 个答案:

答案 0 :(得分:0)

这不是 bodybuilder.js 的解决方案,而是针对使用库的javascript的解决方案-与bodybuilder.js非常相似。它称为 elastic-builder.js

关于您的问题,此代码:

esb.requestBodySearch()
    .agg(esb.filtersAggregation('messages')
    .filter('errors', esb.matchQuery('body', 'error'))
    .filter('warnings', esb.matchQuery('body', 'warning')));

会给您以下答复:

{
  "aggs": {
    "messages": {
      "filters": {
        "filters": {
          "errors": { "match": { "body": "error" }},
          "warnings": { "match": { "body": "warning" }}
        }
      }
    }
  }
}

bodybuilder.js似乎主要是为查询而构建的,因此更易于使用。如果您想在没有繁重的json开销的情况下进行更多控制,elastic-builder可能是一个解决方案。