diff --git a/config.go b/config.go index 9aecde8d..3f2dfcce 100644 --- a/config.go +++ b/config.go @@ -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 } diff --git a/mapping_index.go b/mapping_index.go index 509e1f96..0ce08217 100644 --- a/mapping_index.go +++ b/mapping_index.go @@ -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 != "" { diff --git a/query_date_range.go b/query_date_range.go index 10c2e4ff..ede9c499 100644 --- a/query_date_range.go +++ b/query_date_range.go @@ -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 { diff --git a/query_match.go b/query_match.go index 9fad055f..1852d091 100644 --- a/query_match.go +++ b/query_match.go @@ -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) } diff --git a/query_match_phrase.go b/query_match_phrase.go index ad80c7b3..409ed49a 100644 --- a/query_match_phrase.go +++ b/query_match_phrase.go @@ -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) } diff --git a/query_numeric_range.go b/query_numeric_range.go index 6430fe45..980cc3cc 100644 --- a/query_numeric_range.go +++ b/query_numeric_range.go @@ -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 { diff --git a/query_syntax.go b/query_syntax.go index 860b3115..4efba514 100644 --- a/query_syntax.go +++ b/query_syntax.go @@ -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 } diff --git a/query_term.go b/query_term.go index 18fea765..f3ee99c9 100644 --- a/query_term.go +++ b/query_term.go @@ -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 {