Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bluehalo/elastic-querybuilder
A query builder for Elasticsearch.
https://github.com/bluehalo/elastic-querybuilder
elasticsearch node query-builder
Last synced: about 1 month ago
JSON representation
A query builder for Elasticsearch.
- Host: GitHub
- URL: https://github.com/bluehalo/elastic-querybuilder
- Owner: bluehalo
- License: mit
- Created: 2017-08-08T18:13:18.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-03-14T21:29:08.000Z (almost 7 years ago)
- Last Synced: 2024-10-27T05:19:33.594Z (about 2 months ago)
- Topics: elasticsearch, node, query-builder
- Language: JavaScript
- Homepage:
- Size: 118 KB
- Stars: 9
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# elastic-querybuilder [![Build Status](https://travis-ci.org/Asymmetrik/elastic-querybuilder.svg?branch=develop)](https://travis-ci.org/Asymmetrik/elastic-querybuilder)
> A query builder for Elasticsearch.## Install
```shell
# Install with Yarn
yarn add @asymmetrik/elastic-querybuilder
# Install with npm
npm install --save @asymmetrik/elastic-querybuilder
```## API
> For a more comprehensive set of examples, see the [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) directoryFirst you need to create an instance of the query builder class:
```javascript
const QueryBuilder = require('@asymmetrik/elastic-querybuilder');
const builder = new QueryBuilder();
```### Builder Methods
##### `from`
> Change the starting point for paging to a new number. Default value is 0.```javascript
builder.from(from: number): QueryBuilder
```##### `size`
> Change the number of results to a new number. Default value is 15.```javascript
builder.size(size: number): QueryBuilder
```##### `trackScores`
> Sets the track_scores option.```javascript
builder.trackScores(trackScores: boolean): QueryBuilder
```##### `raw`
> Allows to set a value on the query object at your path.```javascript
builder.raw(size: number): QueryBuilder
```###### Examples
```javascript
const query = new QueryBuilder()
.raw('query.bool.boost', 1.2)
.must('match', 'name', 'Kenny')
.build();//- Generates the following query
{
from: 0,
size: 15,
query: {
bool: {
boost: 1.2, // was set by raw
must: [ { match: { name: 'Kenny' }} ]
}
}
}```
##### `query`
> Build up a query object. If your last or only argument is a function, it will be passed a builder object that can be used to nest boolean queries or build nested queries. The `must`, `should`, `filter`, and `must_not` all have the same API and can be used in the same way.```javascript
builder.query(
operation: string,
field?: string|Object,
value?: string,
options?: Object,
nester?: Function
): QueryBuilder
```###### Examples
Simple Query
``` javascript
const query = new QueryBuilder()
.query('match_all')
.build();//- Generates the following query
{
from: 0,
size: 15,
query: {
match_all: {}
}
}
```Simple Query with options
``` javascript
const query = new QueryBuilder()
.query('match_all', { boost: 2.4, fuzziness: 'auto' })
.build();//- Generates the following query
{
from: 0,
size: 15,
query: {
match_all: {
boost: 2.4,
fuzziness: 'auto'
}
}
}
```Simple Query with field and value
``` javascript
const query = new QueryBuilder()
.query('match', 'location', 'South Park')
.build();//- Generates the following query
{
from: 0,
size: 15,
query: {
match: {
location: 'SouthPark'
}
}
}
```Query with callback to build nested queries.
```javascript
const query = new QueryBuilder()
.should('match', 'firstname', 'Joe')
.should('match', 'firstname', 'John')
.should(builder => builder
.should('match', 'lastname', 'Smith')
.should('match', 'lastname', 'Davis')
)
.build();//- Generates the following query
{
from: 0,
size: 15,
query: {
bool: {
should: [
{ match: { firstname: 'Joe' }},
{ match: { firstname: 'John' }},
{
bool: {
should: [
{ match: { lastname: 'Smith' }},
{ match: { lastname: 'Davis' }}
]
}
}
]
}
}
}
```##### `must`
> Add a must boolean query to your ES query. See `query` above and [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for examples.```javascript
builder.must(
operation: string,
field?: string|Object,
value?: string,
options?: Object,
nester?: Function
): QueryBuilder
```##### `should`
> Add a should boolean query to your ES query. See `query` above and [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for examples.```javascript
builder.should(
operation: string,
field?: string|Object,
value?: string,
options?: Object,
nester?: Function
): QueryBuilder
```##### `filter`
> Add a filter boolean query to your ES query. See `query` above and [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for examples.```javascript
builder.filter(
operation: string,
field?: string|Object,
value?: string,
options?: Object,
nester?: Function
): QueryBuilder
```##### `must_not`
> Add a must_not boolean query to your ES query. See `query` above and [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for examples.```javascript
builder.must_not(
operation: string,
field?: string|Object,
value?: string,
options?: Object,
nester?: Function
): QueryBuilder
```##### `aggs`
> Generate aggregation type queries. This will build up the `aggs` property on an ES query.```javascript
builder.aggs(
type: string
field?: string|Object
options?: Object,
nester?: Function
): QueryBuilder
```###### Examples
Simple Aggregation
```javascript
const query = new QueryBuilder()
.query('match_all')
.raw('explain', true)
.aggs('avg', 'count')
.build();//- Generates the following query
{
from: 0,
size: 15,
explain: true,
query: {
match_all: {}
},
aggs: {
count: {
avg: {
field: 'count'
}
}
}
}
```Multiple Aggregations
```javascript
const query = new QueryBuilder()
.query('match_all')
.aggs('geo_distance', 'location', {
origin: '52.3760, 4.894',
unit: 'km',
ranges: [
{ to: 100 },
{ from: 100, to: 300 },
{ from: 300 }
]
})
.aggs('max', 'price')
.aggs('sum', 'sales')
.build()//- Generates the following query
{
from: 0,
size: 15,
query: {
match_all: {}
},
aggs: {
location: {
geo_distance: {
field: 'location',
origin: '52.3760, 4.894',
unit: 'km',
ranges: [
{ to: 100 },
{ from: 100, to: 300 },
{ from: 300 }
]
}
},
price: {
max: {
field: 'price'
}
},
sales: {
sum: {
field: 'sales'
}
}
}
}```
Nested Aggregations
```javascript
const query = new QueryBuilder()
.query('match_all')
.aggs('nested', { path: 'locations' }, builder => builder
.aggs('terms', 'locations.city')
)
.build()//- Generates the following query
{
from: 0,
size: 15,
query: {
match_all: {}
},
aggs: {
locations: {
nested: {
path: 'locations'
},
aggs: {
'locations.city': {
terms: {
field: 'locations.city'
}
}
}
}
}
}
```##### `sort`
> Add sorting options. This method essentially just takes a key and a value for an object.```javascript
builder.sort(
field?: string, // or Type of sort, could be something like _geo_distance
value?: string|Object
)
```###### Examples
Simple sort
```javascript
const query = new QueryBuilder()
.query( ... )
.sort('age', 'desc')
.build();
//- Generates the following query
{
from: 0,
size: 15,
query: { ... },
sort: [
{ age: 'desc' }
]
}
```Geo distance sort
```javascript
const query = new QueryBuilder()
.query( ... )
.sort('_geo_distance', {
coordinates: [ -70, 40 ],
distance_type: 'arc',
order: 'asc',
unit: 'mi',
mode: 'min'
})
.build();
//- Generates the following query
{
from: 0,
size: 15,
query: { ... },
sort: [
{
_geo_distance: {
coordinates: [ -70, 40 ],
distance_type: 'arc',
order: 'asc',
unit: 'mi',
mode: 'min'
}
}
]
}
```##### `func`
> Add functions to be used in function_score queries. This method essentially just takes a key and a value for an object and is only used when calling `buildFunctionScore`.```javascript
builder.func(
field?: string|Object, // or Type of function
value?: string|Object
)
```###### Examples
Field value factor function
```javascript
const query = new QueryBuilder()
.query( ... )
.func('field_value_factor', {
field: 'number_of_something',
modifier: 'ln2p',
factor: 1
})
.buildFunctionScore();
//- Generates the following query
{
from: 0,
size: 15,
query: {
function_score: {
query: { ... },
functions: [{
field_value_factor: {
field: 'number_of_something',
modifier: 'ln2p',
factor: 1
}
}]
}
}
}
```Filter function
```javascript
const query = new QueryBuilder()
.query( ... )
.func({
weight: 100,
filter: {
match: {
state: 'Colorado'
}
}
})
.buildFunctionScore();
//- Generates the following query
{
from: 0,
size: 15,
query: {
function_score: {
query: { ... },
functions: [{
weight: 100,
filter: {
match: {
state: 'Colorado'
}
}
}]
}
}
}
```### Build Functions
##### `build`
> Build your basic query. This includes parameters set using `query`, `must`, `should`, `filter`, `must_not`, `aggs`, `from`, `size`, and `raw`. See [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for more examples.```javascript
builder.build(
options?: {
// Name for your filtered aggregations, default is 'all'
name?: string,
// Add filters to your aggregations, better for accurate facet counts
filterAggs?: boolean
}
): Object
```##### `buildDisMax`
> Build your basic query. This includes parameters set using `from`, `size`, and `raw`. See [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for more examples.```javascript
builder.buildDisMax(
options: {
tie_breaker: number,
boost: number,
queries: Array,
// You can add more parameters that belong on the
// top level of a dis_max query. These are directly
// passed in so if it is an invalid prop, your
// query will fail
}
): Object
```###### Examples
Building a `dis_max` query
```javascript
const query = new QueryBuilder()
.buildDisMax({
queries: [
{ term: { age: 31 }},
{ term: { age: 32 }}
],
tie_breaker: 1.2,
boost: 2
})
//- Generates the following query
{
from: 0,
size: 15,
query: {
dis_max: {
queries: [
{ term: { age: 31 }},
{ term: { age: 32 }}
],
tie_breaker: 1.2,
boost: 2
}
}
}
```##### `buildMultiMatch`
> Build your basic query. This includes parameters set using `from`, `size`, and `raw`. See [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for more examples.```javascript
builder.buildMultiMatch(
options: {
query: string,
fields: Array,
type: string,
tie_breaker: number,
minimum_should_match: string
// You can add more parameters that belong on the
// top level of a dis_max query. These are directly
// passed in so if it is an invalid prop, your
// query will fail
}
): Object
```###### Examples
Building a `multi_match` query
```javascript
const query = new QueryBuilder()
.buildMultiMatch({
query: 'The Coon',
fields: ['superhero', 'name', 'alias'],
type: 'best_fields',
tie_breaker: 0.3,
minimum_should_match: '30%'
});//- Generates the following query
{
from: 0,
size: 15,
query: {
multi_match: {
query: 'The Coon',
fields: ['superhero', 'name', 'alias'],
type: 'best_fields',
tie_breaker: 0.3,
minimum_should_match: '30%'
}
}
}
```##### `buildFunctionScore`
> Build your basic query. This includes parameters set using `query`, `must`, `should`, `filter`, `must_not`, `aggs`, `func`, `from`, `size`, and `raw`. See [`__tests__`](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/__tests__) for more examples.```javascript
builder.buildFunctionScore(
options?: {
// Name for your filtered aggregations, default is 'all'
name?: string,
// Add filters to your aggregations, better for accurate facet counts
filterAggs?: boolean
}
): Object
```## Contributing
See our [contributors guide](https://github.com/Asymmetrik/elastic-querybuilder/blob/master/.github/CONTRIBUTING.md).