added support for a default field
this works at the config and index mapping levels
This commit is contained in:
parent
79ab2b9b3d
commit
78da6fd65d
@ -54,6 +54,7 @@ type Configuration struct {
|
||||
DefaultHighlighter *string
|
||||
CreateIfMissing bool
|
||||
DefaultDateTimeFormat *string
|
||||
DefaultField *string
|
||||
}
|
||||
|
||||
func (c *Configuration) BuildNewAnalyzer(charFilterNames []string, tokenizerName string, tokenFilterNames []string) (*analysis.Analyzer, error) {
|
||||
@ -349,4 +350,7 @@ func init() {
|
||||
})
|
||||
dateTimeOptionalName := "dateTimeOptional"
|
||||
Config.DefaultDateTimeFormat = &dateTimeOptionalName
|
||||
|
||||
defaultField := "_all"
|
||||
Config.DefaultField = &defaultField
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ var fALSE = false
|
||||
var DEFAULT_ID_FIELD = "_id"
|
||||
var DEFAULT_TYPE_FIELD = "_type"
|
||||
var DEFAULT_TYPE = "_default"
|
||||
var DEFAULT_FIELD = "_all"
|
||||
|
||||
type IndexMapping struct {
|
||||
TypeMapping map[string]*DocumentMapping `json:"types"`
|
||||
@ -33,6 +34,7 @@ type IndexMapping struct {
|
||||
TypeField *string `json:"type_field"`
|
||||
DefaultType *string `json:"default_type"`
|
||||
DefaultAnalyzer *string `json:"default_analyzer"`
|
||||
DefaultField *string `json:"default_field"`
|
||||
}
|
||||
|
||||
func (im *IndexMapping) GoString() string {
|
||||
@ -46,6 +48,7 @@ func NewIndexMapping() *IndexMapping {
|
||||
IdField: &DEFAULT_ID_FIELD,
|
||||
TypeField: &DEFAULT_TYPE_FIELD,
|
||||
DefaultType: &DEFAULT_TYPE,
|
||||
DefaultField: &DEFAULT_FIELD,
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,6 +67,11 @@ func (im *IndexMapping) SetDefaultAnalyzer(analyzer string) *IndexMapping {
|
||||
return im
|
||||
}
|
||||
|
||||
func (im *IndexMapping) SetDefaultField(field string) *IndexMapping {
|
||||
im.DefaultField = &field
|
||||
return im
|
||||
}
|
||||
|
||||
func (im *IndexMapping) MappingForType(docType string) *DocumentMapping {
|
||||
docMapping := im.TypeMapping[docType]
|
||||
if docMapping == nil {
|
||||
@ -80,6 +88,7 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
|
||||
TypeField *string `json:"type_field"`
|
||||
DefaultType *string `json:"default_type"`
|
||||
DefaultAnalyzer *string `json:"default_analyzer"`
|
||||
DefaultField *string `json:"default_field"`
|
||||
}
|
||||
err := json.Unmarshal(data, &tmp)
|
||||
if err != nil {
|
||||
@ -110,6 +119,10 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
|
||||
im.DefaultAnalyzer = tmp.DefaultAnalyzer
|
||||
}
|
||||
|
||||
if tmp.DefaultField != nil {
|
||||
im.DefaultField = tmp.DefaultField
|
||||
}
|
||||
|
||||
im.TypeMapping = make(map[string]*DocumentMapping, len(tmp.TypeMapping))
|
||||
for typeName, typeDocMapping := range tmp.TypeMapping {
|
||||
im.TypeMapping[typeName] = typeDocMapping
|
||||
@ -235,7 +248,6 @@ func (im *IndexMapping) processProperty(property interface{}, path []string, con
|
||||
propertyValueString := propertyValue.String()
|
||||
if subDocMapping != nil {
|
||||
// index by explicit mapping
|
||||
|
||||
for _, fieldMapping := range subDocMapping.Fields {
|
||||
fieldName := getFieldName(pathString, path, fieldMapping)
|
||||
if *fieldMapping.Type == "text" {
|
||||
@ -392,6 +404,15 @@ func (im *IndexMapping) datetimeParserForPath(path string) analysis.DateTimePars
|
||||
return Config.Analysis.DateTimeParsers[*Config.DefaultDateTimeFormat]
|
||||
}
|
||||
|
||||
func (im *IndexMapping) defaultField() string {
|
||||
if im.DefaultField != nil {
|
||||
return *im.DefaultField
|
||||
} else if Config.DefaultField != nil {
|
||||
return *Config.DefaultField
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func getFieldName(pathString string, path []string, fieldMapping *FieldMapping) string {
|
||||
fieldName := pathString
|
||||
if fieldMapping.Name != nil && *fieldMapping.Name != "" {
|
||||
|
@ -63,6 +63,11 @@ func (q *DateRangeQuery) Searcher(i *indexImpl, explain bool) (search.Searcher,
|
||||
return nil, fmt.Errorf("no datetime parser named '%s' registered", *q.DateTimeParser)
|
||||
}
|
||||
|
||||
field := q.FieldVal
|
||||
if q.FieldVal == "" {
|
||||
field = i.m.defaultField()
|
||||
}
|
||||
|
||||
// now parse the endpoints
|
||||
min := math.Inf(-1)
|
||||
max := math.Inf(1)
|
||||
@ -81,7 +86,7 @@ func (q *DateRangeQuery) Searcher(i *indexImpl, explain bool) (search.Searcher,
|
||||
max = numeric_util.Int64ToFloat64(endTime.UnixNano())
|
||||
}
|
||||
|
||||
return search.NewNumericRangeSearcher(i.i, &min, &max, q.FieldVal, q.BoostVal, explain)
|
||||
return search.NewNumericRangeSearcher(i.i, &min, &max, field, q.BoostVal, explain)
|
||||
}
|
||||
|
||||
func (q *DateRangeQuery) Validate() error {
|
||||
|
@ -59,13 +59,18 @@ func (q *MatchQuery) Searcher(i *indexImpl, explain bool) (search.Searcher, erro
|
||||
return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer)
|
||||
}
|
||||
|
||||
field := q.FieldVal
|
||||
if q.FieldVal == "" {
|
||||
field = i.m.defaultField()
|
||||
}
|
||||
|
||||
tokens := analyzer.Analyze([]byte(q.Match))
|
||||
if len(tokens) > 0 {
|
||||
|
||||
tqs := make([]Query, len(tokens))
|
||||
for i, token := range tokens {
|
||||
tqs[i] = NewTermQuery(string(token.Term)).
|
||||
SetField(q.FieldVal).
|
||||
SetField(field).
|
||||
SetBoost(q.BoostVal)
|
||||
}
|
||||
|
||||
|
@ -59,12 +59,17 @@ func (q *MatchPhraseQuery) Searcher(i *indexImpl, explain bool) (search.Searcher
|
||||
return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer)
|
||||
}
|
||||
|
||||
field := q.FieldVal
|
||||
if q.FieldVal == "" {
|
||||
field = i.m.defaultField()
|
||||
}
|
||||
|
||||
tokens := analyzer.Analyze([]byte(q.MatchPhrase))
|
||||
if len(tokens) > 0 {
|
||||
tqs := make([]*TermQuery, len(tokens))
|
||||
for i, token := range tokens {
|
||||
tqs[i] = NewTermQuery(string(token.Term)).
|
||||
SetField(q.FieldVal).
|
||||
SetField(field).
|
||||
SetBoost(q.BoostVal)
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,11 @@ func (q *NumericRangeQuery) SetField(f string) *NumericRangeQuery {
|
||||
}
|
||||
|
||||
func (q *NumericRangeQuery) Searcher(i *indexImpl, explain bool) (search.Searcher, error) {
|
||||
return search.NewNumericRangeSearcher(i.i, q.Min, q.Max, q.FieldVal, q.BoostVal, explain)
|
||||
field := q.FieldVal
|
||||
if q.FieldVal == "" {
|
||||
field = i.m.defaultField()
|
||||
}
|
||||
return search.NewNumericRangeSearcher(i.i, q.Min, q.Max, field, q.BoostVal, explain)
|
||||
}
|
||||
|
||||
func (q *NumericRangeQuery) Validate() error {
|
||||
|
@ -44,7 +44,11 @@ func (q *SyntaxQuery) SetField(f string) *SyntaxQuery {
|
||||
}
|
||||
|
||||
func (q *SyntaxQuery) Searcher(i *indexImpl, explain bool) (search.Searcher, error) {
|
||||
newQuery, err := ParseQuerySyntax(q.Query, i.m, q.DefaultFieldVal)
|
||||
defaultField := q.DefaultFieldVal
|
||||
if q.DefaultFieldVal == "" {
|
||||
defaultField = i.m.defaultField()
|
||||
}
|
||||
newQuery, err := ParseQuerySyntax(q.Query, i.m, defaultField)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -44,7 +44,11 @@ func (q *TermQuery) SetField(f string) *TermQuery {
|
||||
}
|
||||
|
||||
func (q *TermQuery) Searcher(i *indexImpl, explain bool) (search.Searcher, error) {
|
||||
return search.NewTermSearcher(i.i, q.Term, q.FieldVal, q.BoostVal, explain)
|
||||
field := q.FieldVal
|
||||
if q.FieldVal == "" {
|
||||
field = i.m.defaultField()
|
||||
}
|
||||
return search.NewTermSearcher(i.i, q.Term, field, q.BoostVal, explain)
|
||||
}
|
||||
|
||||
func (q *TermQuery) Validate() error {
|
||||
|
Loading…
Reference in New Issue
Block a user