0
0

added support for a default field

this works at the config and index mapping levels
This commit is contained in:
Marty Schoch 2014-08-06 08:23:29 -04:00
parent 79ab2b9b3d
commit 78da6fd65d
8 changed files with 59 additions and 7 deletions

View File

@ -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
}

View File

@ -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 != "" {

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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 {

View File

@ -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
}

View File

@ -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 {