如何将单个.NET类型映射到ElasticSearch / NEST中的多个嵌套对象类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (13)

我正在使用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语法来设置它,但是当使用动态时,没有使用流畅API的类型。最终,我想将流利的API与基于字符串而不是类型的字符串混合。这有意义吗?

提问于
用户回答回答于

如果我正确理解你的意图,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意味着对于将对象作为值嵌套类型映射的所有字段名称都将应用。

使用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"
              }
            }
          }
        }
      }
    }
  }
}

扫码关注云+社区