我正在动态地将对象添加到索引,因此它们都使用_default_ mapping进行索引。这是有问题的,因为它导致像Guid
这样的内容被映射为text
字段而不是keyword
。 NEST客户端提供的AutoMap函数“从任何给定的数据类型自动推断出正确的”字段,但只有在显式调用时才会这样做。有没有办法强制_default_映射使用与AutoMap函数相同的模板?或者我是否需要添加一些循环遍历所有可能对象类型的附加代码,并为每个类型预先创建IndexDescriptor
?
答案 0 :(得分:2)
您可以定义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有关生成的映射。