You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.1 KiB
101 lines
2.1 KiB
8 years ago
|
// 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
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
)
|
||
|
|
||
|
// SuggestField can be used by the caller to specify a suggest field
|
||
|
// at index time. For a detailed example, see e.g.
|
||
|
// http://www.elasticsearch.org/blog/you-complete-me/.
|
||
|
type SuggestField struct {
|
||
|
inputs []string
|
||
|
output *string
|
||
|
payload interface{}
|
||
|
weight int
|
||
|
contextQueries []SuggesterContextQuery
|
||
|
}
|
||
|
|
||
|
func NewSuggestField() *SuggestField {
|
||
|
return &SuggestField{weight: -1}
|
||
|
}
|
||
|
|
||
|
func (f *SuggestField) Input(input ...string) *SuggestField {
|
||
|
if f.inputs == nil {
|
||
|
f.inputs = make([]string, 0)
|
||
|
}
|
||
|
f.inputs = append(f.inputs, input...)
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
func (f *SuggestField) Output(output string) *SuggestField {
|
||
|
f.output = &output
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
func (f *SuggestField) Payload(payload interface{}) *SuggestField {
|
||
|
f.payload = payload
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
func (f *SuggestField) Weight(weight int) *SuggestField {
|
||
|
f.weight = weight
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
func (f *SuggestField) ContextQuery(queries ...SuggesterContextQuery) *SuggestField {
|
||
|
f.contextQueries = append(f.contextQueries, queries...)
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
// MarshalJSON encodes SuggestField into JSON.
|
||
|
func (f *SuggestField) MarshalJSON() ([]byte, error) {
|
||
|
source := make(map[string]interface{})
|
||
|
|
||
|
if f.inputs != nil {
|
||
|
switch len(f.inputs) {
|
||
|
case 1:
|
||
|
source["input"] = f.inputs[0]
|
||
|
default:
|
||
|
source["input"] = f.inputs
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if f.output != nil {
|
||
|
source["output"] = *f.output
|
||
|
}
|
||
|
|
||
|
if f.payload != nil {
|
||
|
source["payload"] = f.payload
|
||
|
}
|
||
|
|
||
|
if f.weight >= 0 {
|
||
|
source["weight"] = f.weight
|
||
|
}
|
||
|
|
||
|
switch len(f.contextQueries) {
|
||
|
case 0:
|
||
|
case 1:
|
||
|
src, err := f.contextQueries[0].Source()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
source["context"] = src
|
||
|
default:
|
||
|
var ctxq []interface{}
|
||
|
for _, query := range f.contextQueries {
|
||
|
src, err := query.Source()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
ctxq = append(ctxq, src)
|
||
|
}
|
||
|
source["context"] = ctxq
|
||
|
}
|
||
|
|
||
|
return json.Marshal(source)
|
||
|
}
|