An elasticsearch query body builder. Easily build complex queries for elasticsearch with a simple, predictable api.
Currently aims to support the full elasticsearch query DSL for versions 1.x. The elasticsearch 2.x query DSL is not currently supported.
Contributions are welcome!
npm install bodybuilder
var Bodybuilder = require('bodybuilder')
var body = new Bodybuilder() // A builder instance.
body.query('match', 'message', 'this is a test').build()
For each elasticsearch query body, create an instance of Bodybuilder
, apply
the desired query/filter/aggregation clauses, and call build
to retrieve the
built query body.
body.query(queryType, [arguments])
Creates a query of type queryType
. Currently supported query types are listed
here.
The specific arguments depend on the type of query, but typically follow this pattern:
queryType
- The name of the query, such as'term'
or'prefix'
.fieldToQuery
- The name of the field in your index to query over.searchTerm
- The string to search for.
var body = new Bodybuilder().query('match', 'message', 'this is a test').build()
// body == {
// query: {
// match: {
// message: 'this is a test'
// }
// }
// }
body.filter(filterType, [arguments])
Creates a filtered query using filter of type filterType
. Currently supported
filter types are listed here.
The specific arguments depend on the type of filter, but typically follow this pattern:
filterType
- The name of the query, such as'regexp'
or'exists'
.fieldToQuery
- The name of the field in your index to filter on.searchTerm
- The string to search for.
var body = new Bodybuilder().filter('term', 'message', 'test').build()
// body == {
// query: {
// filtered: {
// filter: {
// term: {
// message: 'test'
// }
// }
// }
// }
// }
body.aggregation(aggregationType, [arguments])
Creates an aggregation of type aggregationType
. Currently supported
aggregation types are listed here.
The specific arguments depend on the type of aggregation, but typically follow this pattern:
aggregationType
- The name of the aggregation, such as'sum'
or'terms'
.fieldToAggregate
- The name of the field in your index to aggregate over.aggregationName
- (optional) A custom name for the aggregation. Defaults toagg_<aggregationType>_<fieldToAggregate>
.
var body = new BodyBuilder().aggregation('terms', 'user').build()
// body == {
// aggregations: {
// agg_terms_user: {
// terms: {
// field: 'user'
// }
// }
// }
// }
Multiple queries and filters are merged using the boolean query or filter (see Combining Filters).
var body = new BodyBuilder().query('match', 'message', 'this is a test')
.filter('term', 'user', 'kimchy')
.filter('term', 'user', 'herald')
.orFilter('term', 'user', 'johnny')
.notFilter('term', 'user', 'cassie')
.aggregation('terms', 'user')
.build()
// body == {
// query: {
// filtered: {
// query: {
// match: {
// message: 'this is a test'
// }
// },
// filter: {
// bool: {
// must: [
// {term: {user: 'kimchy'}},
// {term: {user: 'herald'}}
// ],
// should: [
// {term: {user: 'johnny'}}
// ],
// must_not: [
// {term: {user: 'cassie'}}
// ]
// }
// }
// },
// aggregations: {
// agg_terms_user: {
// terms: {
// field: 'user'
// }
// }
// }
// }
// }
Set a sort direction using sort(field, direction)
, where direction defaults to
ascending.
var body = new Bodybuilder().filter('term', 'message', 'test')
.sort('date')
.build()
// body == {
// sort: {
// date: {
// order: 'asc'
// }
// },
// query: {
// filtered: {
// filter: {
// term: {
// message: 'test'
// }
// }
// }
// }
// }
Set from
and size
parameters to configure the offset and maximum hits to be
returned.
var body = new Bodybuilder().filter('term', 'message', 'test')
.size(5)
.from(10)
.build()
// body == {
// size: 5,
// from: 10,
// query: {
// filtered: {
// filter: {
// term: {
// message: 'test'
// }
// }
// }
// }
// }
Set any other search request option using rawOption
passing in the key-value
pair to include in the body.
var body = new Bodybuilder().filter('term', 'message', 'test')
.rawOption('_sourceExclude', 'verybigfield')
.build()
// body == {
// _sourceExclude: 'verybigfield',
// query: {
// filtered: {
// filter: {
// term: {
// message: 'test'
// }
// }
// }
// }
// }
Run unit tests:
npm test