我正在使用NEST库与ElasticSearch进行交互,并且试图找到一种基于非类型数据构建索引类型/嵌套对象的方法。该类型具有以下基本结构。
public class Entity : DynamicObject { public string Id { get; set; } // a bunch of other simple properties public override IEnumerable<string> GetDynamicMemberNames() { return Data.Select(x => x.Name); } public override bool TryGetMember(GetMemberBinder binder, out object result) { var dictionary = Data.First(x => x.Name == binder.Name); result = dictionary; return true; } // each instance of one these should be a nested object type public IList<NestedType> Data { get; set; } public class NestedType { // How do I make Name be the nest type name? public string Name { get; set; } public IDictionary<string, string> Values { get; set; } } }
我想为NestedType的每个实例创建一个嵌套的对象/类型。因此,如果有两个NestedType实例,则将有两个嵌套对象。我可以从DynamicObject继承NestedType,将字典变成NEST然后正确映射的“真实”属性(即,将每个字典键变成一个属性)。问题是我不知道如何设置嵌套对象的名称/类型。
我知道有两种方法来映射名称:ElasticType属性和NestedObject流畅接口。这里的问题是,有一个单一类型代表多个嵌套对象类型。我可以进行一些运行时类型构建,但是如果可以避免的话,我宁愿不这样做。
有没有办法将方法或属性用作嵌套对象的名称/类型?还是有更好的方法将此类型的数据映射到ElasticSearch(希望通过NEST)?
谢谢!埃里克
编辑
我更新了实体定义以反映我在做什么(使用DynamicObject使JsonSerializer可以执行我想要的操作)。我想要的是不同词典具有不同映射(不同词干,分析器等)的能力。如果有适当的类型,我可以使用NEST fluent语法进行设置,但使用动态时,没有类型可供fluent API使用。最终,我想将流畅的API与基于字符串而不是类型的字符串混合。这有意义吗?
如果我正确理解了您的意图,那么Entity对象中只会嵌套对象,不是吗?
Entity
您可以尝试对实体对象使用elasticsearch的动态映射功能。我假设实体是一个根对象。
curl -X POST localhost:9200/myindex/entity/_mapping {"dynamic_templates": [ {"nested_data_template": { "mapping": { "type": "nested" }, "match_mapping_type": "object", "path_match": "*" }}]}
path_match: *并match_mapping_type: object表示将对所有以object作为值的字段名称应用嵌套类型映射。
path_match: *
match_mapping_type: object
使用NEST和Fluent API,您可以使用以下API。IntelliSense将指导您如何构建上面的映射。;)
descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>)
每次出现与该模板匹配的新属性时,elasticsearch都会基于动态映射更新映射。一段时间后,您的映射将如下所示:
{ "entity": { "mappings": { "entity": { "dynamic_templates": [ { "nested_data_template": { "mapping": { "type": "nested" }, "match_mapping_type": "object", "path_match": "*" } } ], "properties": { "test": { "type": "nested", "properties": { "test": { "type": "string" }, "another_property": { "type": "string" } } }, "test1": { "type": "nested", "properties": { "test": { "type": "string" } } } } } } } }
希望这会有所帮助!