Add support for post filter in Search

Search requests can now accept a post filter applied after all hits were
returned from the database. For example:

    esquery.Search().
        Query(...).
        Aggs(...).
        PostFilter(esquery.Range(field).Gt(0)).
        Run(...)
This commit is contained in:
Ido Perlmuter 2020-05-20 11:29:34 +03:00
parent 7fa767fc28
commit d7b8bc87a2
2 changed files with 24 additions and 6 deletions

View File

@ -15,12 +15,13 @@ import (
// Not all features of the search API are currently supported, but a request can
// currently include a query, aggregations, and more.
type SearchRequest struct {
query Mappable
aggs []Aggregation
from *uint64
size *uint64
explain *bool
timeout *time.Duration
query Mappable
aggs []Aggregation
postFilter Mappable
from *uint64
size *uint64
explain *bool
timeout *time.Duration
}
// Search creates a new SearchRequest object, to be filled via method chaining.
@ -40,6 +41,12 @@ func (req *SearchRequest) Aggs(aggs ...Aggregation) *SearchRequest {
return req
}
// PostFilter sets a post_filter for the request.
func (req *SearchRequest) PostFilter(filter Mappable) *SearchRequest {
req.postFilter = filter
return req
}
// From sets a document offset to start from.
func (req *SearchRequest) From(offset uint64) *SearchRequest {
req.from = &offset
@ -81,6 +88,9 @@ func (req *SearchRequest) Map() map[string]interface{} {
m["aggs"] = aggs
}
if req.postFilter != nil {
m["post_filter"] = req.postFilter.Map()
}
if req.size != nil {
m["size"] = *req.size
}

View File

@ -42,6 +42,7 @@ func TestSearchMaps(t *testing.T) {
StringStats("tag_stats", "tags").
ShowDistribution(true),
).
PostFilter(Range("score").Gt(0)).
Size(30).
From(5).
Explain(true).
@ -87,6 +88,13 @@ func TestSearchMaps(t *testing.T) {
},
},
},
"post_filter": map[string]interface{}{
"range": map[string]interface{}{
"score": map[string]interface{}{
"gt": 0,
},
},
},
"size": 30,
"from": 5,
"explain": true,