From d7b8bc87a2490548ae57faf99e2ae04f65f51ced Mon Sep 17 00:00:00 2001 From: Ido Perlmuter Date: Wed, 20 May 2020 11:29:34 +0300 Subject: [PATCH] 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(...) --- search.go | 22 ++++++++++++++++------ search_test.go | 8 ++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/search.go b/search.go index c58d5fb..a0b15cf 100644 --- a/search.go +++ b/search.go @@ -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 } diff --git a/search_test.go b/search_test.go index 6edb561..5dcfce3 100644 --- a/search_test.go +++ b/search_test.go @@ -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,