如何使用NEST客户端配置Elasticsearch以将AutoMap类型用作动态映射对象的默认模板?

时间:2017-08-01 15:35:40

标签: .net elasticsearch nest

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

1 个答案:

答案 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有关生成的映射。