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" }}
        }
      },
    }
  }
}
Другие вопросы по тегам