204 lines
4.1 KiB
Go
204 lines
4.1 KiB
Go
// Copyright 2012-2015 Oliver Eilhard. All rights reserved.
|
|
// Use of this source code is governed by a MIT-license.
|
|
// See http://olivere.mit-license.org/license.txt for details.
|
|
|
|
package elastic
|
|
|
|
// Allow to specify field facets that return the N most frequent terms.
|
|
// See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-terms-facet.html
|
|
type TermsFacet struct {
|
|
facetFilter Filter
|
|
global *bool
|
|
nested string
|
|
mode string
|
|
|
|
fieldName string
|
|
fields []string
|
|
size int
|
|
shardSize *int
|
|
allTerms *bool
|
|
exclude []string
|
|
regex string
|
|
regexFlags string
|
|
comparatorType string
|
|
script string
|
|
lang string
|
|
params map[string]interface{}
|
|
executionHint string
|
|
index string
|
|
}
|
|
|
|
func NewTermsFacet() TermsFacet {
|
|
f := TermsFacet{
|
|
size: 10,
|
|
fields: make([]string, 0),
|
|
exclude: make([]string, 0),
|
|
params: make(map[string]interface{}),
|
|
}
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) FacetFilter(filter Facet) TermsFacet {
|
|
f.facetFilter = filter
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Global(global bool) TermsFacet {
|
|
f.global = &global
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Nested(nested string) TermsFacet {
|
|
f.nested = nested
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Mode(mode string) TermsFacet {
|
|
f.mode = mode
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Field(fieldName string) TermsFacet {
|
|
f.fieldName = fieldName
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Fields(fields ...string) TermsFacet {
|
|
f.fields = append(f.fields, fields...)
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) ScriptField(scriptField string) TermsFacet {
|
|
f.script = scriptField
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Exclude(exclude ...string) TermsFacet {
|
|
f.exclude = append(f.exclude, exclude...)
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Size(size int) TermsFacet {
|
|
f.size = size
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) ShardSize(shardSize int) TermsFacet {
|
|
f.shardSize = &shardSize
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Regex(regex string) TermsFacet {
|
|
f.regex = regex
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) RegexFlags(regexFlags string) TermsFacet {
|
|
f.regexFlags = regexFlags
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Order(order string) TermsFacet {
|
|
f.comparatorType = order
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Comparator(comparatorType string) TermsFacet {
|
|
f.comparatorType = comparatorType
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Script(script string) TermsFacet {
|
|
f.script = script
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Lang(lang string) TermsFacet {
|
|
f.lang = lang
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) ExecutionHint(hint string) TermsFacet {
|
|
f.executionHint = hint
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Param(name string, value interface{}) TermsFacet {
|
|
f.params[name] = value
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) AllTerms(allTerms bool) TermsFacet {
|
|
f.allTerms = &allTerms
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) Index(index string) TermsFacet {
|
|
f.index = index
|
|
return f
|
|
}
|
|
|
|
func (f TermsFacet) addFilterFacetAndGlobal(source map[string]interface{}) {
|
|
if f.facetFilter != nil {
|
|
source["facet_filter"] = f.facetFilter.Source()
|
|
}
|
|
if f.nested != "" {
|
|
source["nested"] = f.nested
|
|
}
|
|
if f.global != nil {
|
|
source["global"] = *f.global
|
|
}
|
|
if f.mode != "" {
|
|
source["mode"] = f.mode
|
|
}
|
|
}
|
|
|
|
func (f TermsFacet) Source() interface{} {
|
|
source := make(map[string]interface{})
|
|
f.addFilterFacetAndGlobal(source)
|
|
opts := make(map[string]interface{})
|
|
source["terms"] = opts
|
|
|
|
if len(f.fields) > 0 {
|
|
if len(f.fields) == 1 {
|
|
opts["field"] = f.fields[0]
|
|
} else {
|
|
opts["fields"] = f.fields
|
|
}
|
|
} else {
|
|
opts["field"] = f.fieldName
|
|
}
|
|
opts["size"] = f.size
|
|
if f.shardSize != nil && *f.shardSize > f.size {
|
|
opts["shard_size"] = *f.shardSize
|
|
}
|
|
if len(f.exclude) > 0 {
|
|
opts["exclude"] = f.exclude
|
|
}
|
|
if f.regex != "" {
|
|
opts["regex"] = f.regex
|
|
if f.regexFlags != "" {
|
|
opts["regex_flags"] = f.regexFlags
|
|
}
|
|
}
|
|
if f.comparatorType != "" {
|
|
opts["order"] = f.comparatorType
|
|
}
|
|
if f.allTerms != nil {
|
|
opts["all_terms"] = *f.allTerms
|
|
}
|
|
if f.script != "" {
|
|
opts["script"] = f.script
|
|
if f.lang != "" {
|
|
opts["lang"] = f.lang
|
|
}
|
|
if len(f.params) > 0 {
|
|
opts["params"] = f.params
|
|
}
|
|
}
|
|
if f.executionHint != "" {
|
|
opts["execution_hint"] = f.executionHint
|
|
}
|
|
return source
|
|
}
|