我想基于字段中的关键字出现次数创建存储桶。
我查看了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实现过滤器聚合吗?
答案 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可能是一个解决方案。