Bodybuilder js: агрегирование фильтров ведра
Я хотел бы сделать корзины на основе вхождений ключевых слов в поле.
Я проверил документацию по elasticsearch и обнаружил, что агрегация фильтров должна подойти: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html
В настоящее время мы используем bodybuilder.js для создания запросов. Я нашел в исходном коде (https://github.com/danpaz/bodybuilder/blob/master/src/aggregation-builder.js) недокументированную функцию:
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?
2 ответа
Это не решение для bodybuilder.js, но один для JavaScript с использованием библиотеки - очень похож на bodybuilder.js. Это называется https://elastic-builder.js.org/.
Что касается вашего вопроса, этот код:
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-конструктора, может быть решением.
Мы можем сделать это в bodybuilder.js следующим образом:
bodybuilder().aggregation('filters', {
"filters": {
"errors": { "term": { "body": "error" } },
"warnings": { "term": { "body": "warning" } }
}
}, 'messages').build();
приведенный выше код сгенерирует запрос:
{
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"errors" : { "term" : { "body" : "error" }},
"warnings" : { "term" : { "body" : "warning" }}
}
},
}
}
}