func (f *FilterWrap) addFilters(fl []interface{}) {
	if len(fl) > 1 {
		fc := fl[0]
		switch fc.(type) {
		case BoolClause, string:
			f.boolClause = fc.(string)
			fl = fl[1:]
		}
	}
	f.filters = append(f.filters, fl...)
}
Custom marshalling to support the query dsl
package elastigo
import (
	"encoding/json"
	"fmt"
	"github.com/araddon/gou"
)
var (
	_ = gou.DEBUG
)
type BoolClause string
type TermExecutionMode string
const (
	TEMDefault TermExecutionMode = ""
	TEMPlain TermExecutionMode = "plain"
	TEMField TermExecutionMode = "field_data"
	TEMBool TermExecutionMode = "bool"
	TEMAnd TermExecutionMode = "and"
	TEMOr TermExecutionMode = "or"
)
type FilterClause interface {
	String() string
}
type FilterWrap struct {
	boolClause string
	filters    []interface{}
}
func NewFilterWrap() *FilterWrap {
	return &FilterWrap{filters: make([]interface{}, 0), boolClause: "and"}
}
func (f *FilterWrap) String() string {
	return fmt.Sprintf(`fopv: %d:%v`, len(f.filters), f.filters)
}
func (f *FilterWrap) Bool(s string) {
	f.boolClause = s
}