我正在动态地将对象添加到索引,因此它们都使用_default_ mapping进行索引。这是有问题的,因为它导致像Guid
被映射为text
字段而不是keyword
。 NEST客户端提供的AutoMap函数“自动从任何给定的数据类型中推断出正确的”字段,但只有在显式调用时才会这样做。有没有办法强制_default_映射使用与AutoMap函数相同的模板?或者我是否需要添加一些其他代码来循环遍历所有可能的对象类型并为每个类型预先创建一个IndexDescriptor
?
您可以定义index template以将映射应用于新创建的模板
var putIndexTemplateResponse = client.PutIndexTemplate("default", t => t
.Template("*")
.Mappings(m => m
.Map("_default_", tm => tm
.Properties(p => p
.Keyword(k => k
.Name("id")
)
)
)
)
);
这会将任何新创建的索引中的任何类型的id
属性映射为关键字字段。
如果您需要更基于约定的内容,可以使用带有规则的dynamic templates来确定应如何映射动态添加的字段
var createIndexResponse = client.CreateIndex("index-name", t => t
.Mappings(m => m
.Map("_default_", tm => tm
.DynamicTemplates(d => d
.DynamicTemplate("default", dt => dt
.Match("id")
.MatchMappingType("string")
.Mapping(mm => mm
.Keyword(k => k)
)
)
)
)
)
);
这两种方法都在Elasticsearch中设置了映射约定。如果您打算在自己的代码中确定任何约定,例如using the visitor pattern,您需要明确告诉Elasticsearch有关生成的映射。