https://github.com/tj/es
Go DSL for Elasticsearch queries
https://github.com/tj/es
Last synced: 5 months ago
JSON representation
Go DSL for Elasticsearch queries
- Host: GitHub
- URL: https://github.com/tj/es
- Owner: tj
- Created: 2017-06-01T20:34:45.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2017-06-02T02:49:32.000Z (over 8 years ago)
- Last Synced: 2025-03-27T11:51:21.340Z (10 months ago)
- Language: Go
- Homepage:
- Size: 18.6 KB
- Stars: 207
- Watchers: 4
- Forks: 5
- Open Issues: 5
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
# ES
Package es provides an Elasticsearch query DSL.
## About
The use of Go "dot imports" is discouraged, however I'd recommend abstracting this logic into higher level query functions and packages if you'd like to utilize the expressiveness of dot imports in this scenario. I wouldn't recommend dot-importing it into other packages directly.
## Example
### Lispy
If you don't mind crazy nesting:
```go
query := Pretty(Query(
Aggs(
Agg("results",
Filter(
Term("user.login", "tj"),
Range("now-7d", "now"),
)(
Aggs(
Agg("repos",
Terms("repository.name.keyword", 100),
Aggs(
Agg("labels",
Terms("issue.labels.keyword", 100),
Aggs(
Agg("duration_sum", Sum("duration"))))))))))))
```
### Less lispy
If you do mind crazy nesting:
```go
labels := Aggs(
Agg("labels",
Terms("issue.labels.keyword", 100),
Aggs(
Agg("duration_sum",
Sum("duration")))))
repos := Aggs(
Agg("repos",
Terms("repository.name.keyword", 100),
labels))
filter := Filter(
Term("user.login", "tj"),
Range("now-7d", "now"))
results := Aggs(
Agg("results",
filter(repos)))
query := Pretty(Query(results))
```
Both yielding:
```json
{
"aggs": {
"results": {
"aggs": {
"repos": {
"aggs": {
"labels": {
"aggs": {
"duration_sum": {
"sum": {
"field": "duration"
}
}
},
"terms": {
"field": "issue.labels.keyword",
"size": 100
}
}
},
"terms": {
"field": "repository.name.keyword",
"size": 100
}
}
},
"filter": {
"bool": {
"filter": [
{
"term": {
"user.login": "tj"
}
},
{
"range": {
"timestamp": {
"gte": "now-7d",
"lte": "now"
}
}
}
]
}
}
}
},
"size": 0
}
```
### Reuse
This also makes reuse more trivial, for example note how `sum` is re-used in the following snippet to fetch global, daily, and label-level summation.
```go
sum := Agg("duration_sum", Sum("duration"))
labels := Agg("labels",
Terms("issue.labels.keyword", 100),
Aggs(sum))
days := Agg("days",
DateHistogram("1d"),
Aggs(sum, labels))
query := Query(Aggs(sum, labels, days))
```
Yielding:
```json
{
"aggs": {
"days": {
"aggs": {
"duration_sum": {
"sum": {
"field": "duration"
}
},
"labels": {
"aggs": {
"duration_sum": {
"sum": {
"field": "duration"
}
}
},
"terms": {
"field": "issue.labels.keyword",
"size": 100
}
}
},
"date_histogram": {
"field": "timestamp",
"interval": "1d"
}
},
"duration_sum": {
"sum": {
"field": "duration"
}
},
"labels": {
"aggs": {
"duration_sum": {
"sum": {
"field": "duration"
}
}
},
"terms": {
"field": "issue.labels.keyword",
"size": 100
}
}
},
"size": 0
}
```
---
[](https://godoc.org/github.com/tj/es)

