ElasticSearch 返回的嵌套属性未映射到 C# 类

Posted

技术标签:

【中文标题】ElasticSearch 返回的嵌套属性未映射到 C# 类【英文标题】:ElasticSearch returned nested property not mapping to C# class 【发布时间】:2021-12-24 06:21:35 【问题描述】:

我在 ElasticSearch 中有一个嵌套对象,我试图将它映射到 C# 中的列表中,但它总是返回 NULL

我的 C# 类如下所示:

    [ElasticsearchType(RelationName = "part")]
    public class Product 
    
         [JsonPropertyName("PartNumber")]
         [Keyword(Name = "PartNumber")]
         public string ProductNumber  get; set; 

         [JsonPropertyName("Pricing")]
         [Nested]
         public IList<PartPricing> Pricing  get; set; 
    

    [ElasticsearchType(RelationName = "Pricing")]
    public class PartPricing
    
        [Keyword(Name = "Application")]
        public string Application  get; set; 

        [JsonPropertyName("BasePrice")]
        [Number(NumberType.Double, Name = "BasePrice")]
        public decimal BasePrice  get; set; 

        [Boolean(Name = "IsFreeShipping")]
        public bool IsFreeShipping  get;set; 

        [JsonPropertyName("CustomerPrice")]
        [Number(NumberType.Double, Name = "CustomerPrice")]
        public decimal CustomerPrice  get; set; 
       

当我使用 NEST C# 构建查询时,然后运行以下命令

var response = _context.Client.Search&lt;T&gt;(searchDescriptor);

如果我查看响应,则 REQUEST 的 DEBUG 信息如下所示:


    "query": 
        "bool": 
            "must": [
                
                    "term": 
                        "PartNumber": 
                            "value": "1001"
                        
                    
                
            ]
        
    ,
    "_source": 
        "includes": [
            "id",
            "PartNumber",
            "Pricing"
        ]
    

响应如下所示:


    "took": 63,
    "timed_out": false,
    "_shards": 
        "total": 6,
        "successful": 6,
        "skipped": 0,
        "failed": 0
    ,
    "hits": 
        "total": 1,
        "max_score": null,
        "hits": [
            
                "_index": "parts",
                "_type": "part",
                "_id": "~111111",
                "_score": null,
                "_source": 
                    "id": 1234
                    "PartNumber": "1001",
                    "Pricing": [
                        
                            "BasePrice": 95.0,
                            "IsFreeShipping": true,
                            "Application": "TEST",
                            "CustomerPrice": 161.5
                        
                    ]
                ,
                "sort": [
                    2,
                    470
                ]
            
        ]
    

所以我可以看到定价信息正在从查询中返回,但它没有正确映射到我的 C# 类中,因为定价属性始终为 NULL。我猜我的类定义有问题,但我不确定是什么。这是我第一次使用 ElasticSearch。我可以毫无问题地返回其他十进制或字符串值,但嵌套值根本不返回。

【问题讨论】:

我最终能够找出问题所在。我想在使用 NESTED 属性时,还需要添加一个 name 属性,因此在我的 Product 类中我需要按如下方式创建属性 [Nested(Name = "Pricing")] 【参考方案1】:

我最终能够找出问题所在。我想在使用 NESTED 属性时,还需要添加一个 name 属性,因此在我的 Product 类中,我需要按如下方式制作属性

[Nested(Name = "Pricing")]

【讨论】:

以上是关于ElasticSearch 返回的嵌套属性未映射到 C# 类的主要内容,如果未能解决你的问题,请参考以下文章

对映射的DynamoDb数据进行Elasticsearch嵌套查询不返回任何内容

嵌套排序未按预期工作 ElasticSearch

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

将mysql查询中项目的嵌套列表属性映射到c#对象

Logstash 2.3.4如何使用logstash-jdbc插件在Elasticsearch中加载嵌套文档

Elasticsearch 为嵌套数组创建映射