add support for toggling Store/Index Dynamic in IndexMapping
This commit is contained in:
parent
d7292ed891
commit
57919a77f5
@ -363,11 +363,11 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
|
|||||||
parsedDateTime, err := dateTimeParser.ParseDateTime(propertyValueString)
|
parsedDateTime, err := dateTimeParser.ParseDateTime(propertyValueString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// index as text
|
// index as text
|
||||||
fieldMapping := newTextFieldMappingDynamic()
|
fieldMapping := newTextFieldMappingDynamic(context.im)
|
||||||
fieldMapping.processString(propertyValueString, pathString, path, indexes, context)
|
fieldMapping.processString(propertyValueString, pathString, path, indexes, context)
|
||||||
} else {
|
} else {
|
||||||
// index as datetime
|
// index as datetime
|
||||||
fieldMapping := newDateTimeFieldMappingDynamic()
|
fieldMapping := newDateTimeFieldMappingDynamic(context.im)
|
||||||
fieldMapping.processTime(parsedDateTime, pathString, path, indexes, context)
|
fieldMapping.processTime(parsedDateTime, pathString, path, indexes, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -387,7 +387,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
|
|||||||
}
|
}
|
||||||
} else if dm.Dynamic {
|
} else if dm.Dynamic {
|
||||||
// automatic indexing behavior
|
// automatic indexing behavior
|
||||||
fieldMapping := newNumericFieldMappingDynamic()
|
fieldMapping := newNumericFieldMappingDynamic(context.im)
|
||||||
fieldMapping.processFloat64(propertyValFloat, pathString, path, indexes, context)
|
fieldMapping.processFloat64(propertyValFloat, pathString, path, indexes, context)
|
||||||
}
|
}
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
@ -399,7 +399,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
|
|||||||
}
|
}
|
||||||
} else if dm.Dynamic {
|
} else if dm.Dynamic {
|
||||||
// automatic indexing behavior
|
// automatic indexing behavior
|
||||||
fieldMapping := newBooleanFieldMappingDynamic()
|
fieldMapping := newBooleanFieldMappingDynamic(context.im)
|
||||||
fieldMapping.processBoolean(propertyValBool, pathString, path, indexes, context)
|
fieldMapping.processBoolean(propertyValBool, pathString, path, indexes, context)
|
||||||
}
|
}
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
@ -412,7 +412,7 @@ func (dm *DocumentMapping) processProperty(property interface{}, path []string,
|
|||||||
fieldMapping.processTime(property, pathString, path, indexes, context)
|
fieldMapping.processTime(property, pathString, path, indexes, context)
|
||||||
}
|
}
|
||||||
} else if dm.Dynamic {
|
} else if dm.Dynamic {
|
||||||
fieldMapping := newDateTimeFieldMappingDynamic()
|
fieldMapping := newDateTimeFieldMappingDynamic(context.im)
|
||||||
fieldMapping.processTime(property, pathString, path, indexes, context)
|
fieldMapping.processTime(property, pathString, path, indexes, context)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -61,10 +61,10 @@ func NewTextFieldMapping() *FieldMapping {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTextFieldMappingDynamic() *FieldMapping {
|
func newTextFieldMappingDynamic(im *IndexMapping) *FieldMapping {
|
||||||
rv := NewTextFieldMapping()
|
rv := NewTextFieldMapping()
|
||||||
rv.Store = StoreDynamic
|
rv.Store = im.StoreDynamic
|
||||||
rv.Index = IndexDynamic
|
rv.Index = im.IndexDynamic
|
||||||
return rv
|
return rv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,10 +78,10 @@ func NewNumericFieldMapping() *FieldMapping {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newNumericFieldMappingDynamic() *FieldMapping {
|
func newNumericFieldMappingDynamic(im *IndexMapping) *FieldMapping {
|
||||||
rv := NewNumericFieldMapping()
|
rv := NewNumericFieldMapping()
|
||||||
rv.Store = StoreDynamic
|
rv.Store = im.StoreDynamic
|
||||||
rv.Index = IndexDynamic
|
rv.Index = im.IndexDynamic
|
||||||
return rv
|
return rv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,10 +95,10 @@ func NewDateTimeFieldMapping() *FieldMapping {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDateTimeFieldMappingDynamic() *FieldMapping {
|
func newDateTimeFieldMappingDynamic(im *IndexMapping) *FieldMapping {
|
||||||
rv := NewDateTimeFieldMapping()
|
rv := NewDateTimeFieldMapping()
|
||||||
rv.Store = StoreDynamic
|
rv.Store = im.StoreDynamic
|
||||||
rv.Index = IndexDynamic
|
rv.Index = im.IndexDynamic
|
||||||
return rv
|
return rv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,10 +112,10 @@ func NewBooleanFieldMapping() *FieldMapping {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBooleanFieldMappingDynamic() *FieldMapping {
|
func newBooleanFieldMappingDynamic(im *IndexMapping) *FieldMapping {
|
||||||
rv := NewBooleanFieldMapping()
|
rv := NewBooleanFieldMapping()
|
||||||
rv.Store = StoreDynamic
|
rv.Store = im.StoreDynamic
|
||||||
rv.Index = IndexDynamic
|
rv.Index = im.IndexDynamic
|
||||||
return rv
|
return rv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,6 +130,8 @@ type IndexMapping struct {
|
|||||||
DefaultDateTimeParser string `json:"default_datetime_parser"`
|
DefaultDateTimeParser string `json:"default_datetime_parser"`
|
||||||
DefaultField string `json:"default_field"`
|
DefaultField string `json:"default_field"`
|
||||||
ByteArrayConverter string `json:"byte_array_converter"`
|
ByteArrayConverter string `json:"byte_array_converter"`
|
||||||
|
StoreDynamic bool `json:"store_dynamic"`
|
||||||
|
IndexDynamic bool `json:"index_dynamic"`
|
||||||
CustomAnalysis *customAnalysis `json:"analysis,omitempty"`
|
CustomAnalysis *customAnalysis `json:"analysis,omitempty"`
|
||||||
cache *registry.Cache
|
cache *registry.Cache
|
||||||
}
|
}
|
||||||
@ -233,6 +235,8 @@ func NewIndexMapping() *IndexMapping {
|
|||||||
DefaultDateTimeParser: defaultDateTimeParser,
|
DefaultDateTimeParser: defaultDateTimeParser,
|
||||||
DefaultField: defaultField,
|
DefaultField: defaultField,
|
||||||
ByteArrayConverter: defaultByteArrayConverter,
|
ByteArrayConverter: defaultByteArrayConverter,
|
||||||
|
IndexDynamic: IndexDynamic,
|
||||||
|
StoreDynamic: StoreDynamic,
|
||||||
CustomAnalysis: newCustomAnalysis(),
|
CustomAnalysis: newCustomAnalysis(),
|
||||||
cache: registry.NewCache(),
|
cache: registry.NewCache(),
|
||||||
}
|
}
|
||||||
@ -295,6 +299,8 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
|
|||||||
im.ByteArrayConverter = defaultByteArrayConverter
|
im.ByteArrayConverter = defaultByteArrayConverter
|
||||||
im.DefaultMapping = NewDocumentMapping()
|
im.DefaultMapping = NewDocumentMapping()
|
||||||
im.TypeMapping = make(map[string]*DocumentMapping)
|
im.TypeMapping = make(map[string]*DocumentMapping)
|
||||||
|
im.StoreDynamic = StoreDynamic
|
||||||
|
im.IndexDynamic = IndexDynamic
|
||||||
|
|
||||||
var invalidKeys []string
|
var invalidKeys []string
|
||||||
for k, v := range tmp {
|
for k, v := range tmp {
|
||||||
@ -344,6 +350,16 @@ func (im *IndexMapping) UnmarshalJSON(data []byte) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
case "store_dynamic":
|
||||||
|
err := json.Unmarshal(v, &im.StoreDynamic)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case "index_dynamic":
|
||||||
|
err := json.Unmarshal(v, &im.IndexDynamic)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
invalidKeys = append(invalidKeys, k)
|
invalidKeys = append(invalidKeys, k)
|
||||||
}
|
}
|
||||||
|
@ -339,6 +339,7 @@ func TestMappingWithTokenizerDeps(t *testing.T) {
|
|||||||
|
|
||||||
func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
|
func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
|
||||||
|
|
||||||
|
// first verify that with system defaults, dynamic field is stored
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"name": "bleve",
|
"name": "bleve",
|
||||||
}
|
}
|
||||||
@ -354,11 +355,13 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now change system level defaults, verify dynamic field is not stored
|
||||||
StoreDynamic = false
|
StoreDynamic = false
|
||||||
defer func() {
|
defer func() {
|
||||||
StoreDynamic = true
|
StoreDynamic = true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
mapping = NewIndexMapping()
|
||||||
doc = document.NewDocument("y")
|
doc = document.NewDocument("y")
|
||||||
err = mapping.mapDocument(doc, data)
|
err = mapping.mapDocument(doc, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -369,6 +372,20 @@ func TestEnablingDisablingStoringDynamicFields(t *testing.T) {
|
|||||||
t.Errorf("expected field 'name' to be not stored, is")
|
t.Errorf("expected field 'name' to be not stored, is")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now override the system level defaults inside the index mapping
|
||||||
|
mapping = NewIndexMapping()
|
||||||
|
mapping.StoreDynamic = true
|
||||||
|
doc = document.NewDocument("y")
|
||||||
|
err = mapping.mapDocument(doc, data)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
for _, field := range doc.Fields {
|
||||||
|
if field.Name() == "name" && !field.Options().IsStored() {
|
||||||
|
t.Errorf("expected field 'name' to be stored, isn't")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMappingBool(t *testing.T) {
|
func TestMappingBool(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user