diff --git a/collapse.go b/collapse.go new file mode 100644 index 0000000..f3f3286 --- /dev/null +++ b/collapse.go @@ -0,0 +1,14 @@ +package query + +// Collapse represents the "collapse" param that can be applied to a request +// see: https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html +type Collapse struct { + field string +} + +// Map returns a map representation of the Source object. +func (source Collapse) Map() map[string]interface{} { + return map[string]interface{}{ + "field": source.field, + } +} diff --git a/collapse_test.go b/collapse_test.go new file mode 100644 index 0000000..26f4c33 --- /dev/null +++ b/collapse_test.go @@ -0,0 +1,22 @@ +package query + +import ( + "testing" +) + +func TestCollapse_Map(t *testing.T) { + runMapTests( + t, + []mapTest{ + { + name: "collapse", + q: Collapse{ + field: "collapse_field", + }, + exp: map[string]interface{}{ + "field": "collapse_field", + }, + }, + }, + ) +} diff --git a/search.go b/search.go index af685ca..0dd3b10 100644 --- a/search.go +++ b/search.go @@ -26,6 +26,7 @@ type SearchRequest struct { sorts Sorts source Source timeout *time.Duration + collapse *Collapse } // Search creates a new SearchRequest object, to be filled via method chaining. @@ -107,6 +108,13 @@ func (req *SearchRequest) Highlight(highlight Mappable) *SearchRequest { return req } +// Collapse sets the collapse param for the request. +// See:https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html +func (req *SearchRequest) Collapse(collapse *Collapse) *SearchRequest { + req.collapse = collapse + return req +} + // Map implements the Mappable interface. It converts the request to into a // nested map[string]interface{}, as expected by the go-elasticsearch library. func (req *SearchRequest) Map() map[string]interface{} { @@ -146,6 +154,9 @@ func (req *SearchRequest) Map() map[string]interface{} { if req.searchAfter != nil { m["search_after"] = req.searchAfter } + if req.collapse != nil { + m["collapse"] = req.collapse.Map() + } source := req.source.Map() if len(source) > 0 { diff --git a/search_test.go b/search_test.go index c748648..e2c0bed 100644 --- a/search_test.go +++ b/search_test.go @@ -132,5 +132,18 @@ func TestSearchMaps(t *testing.T) { }, }, }, + { + "a simple match_all query with a size and collapse", + Search().Query(MatchAll()).Size(20).Collapse(&Collapse{field: "collapse_field"}), + map[string]interface{}{ + "query": map[string]interface{}{ + "match_all": map[string]interface{}{}, + }, + "collapse": map[string]interface{}{ + "field": "collapse_field", + }, + "size": 20, + }, + }, }) }