elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# Elasticsearch 6.x中连接类型与嵌套类型的组合及查询

C# Elasticsearch 6.x中连接类型与嵌套类型的组合及查询,c#,elasticsearch,nest,C#,elasticsearch,Nest,总之,我正在使用ElasticSearch 6.x和NEST,为了简单起见,我根据这里提供的NEST 6.x文档创建了具有以下POCO设置的映射。我的数据模型是一个简单的模型 顾客 命令 包装 订单项 这是C#POCO设置 [ElasticsearchType(Name = "customer")] public class Customer { [PropertyName("customerId")] public int CustomerId { get; set; }

总之,我正在使用ElasticSearch 6.x和NEST,为了简单起见,我根据这里提供的NEST 6.x文档创建了具有以下POCO设置的映射。我的数据模型是一个简单的模型

  • 顾客

  • 命令

  • 包装

  • 订单项

    这是C#POCO设置

    [ElasticsearchType(Name = "customer")]
    public class Customer 
    {
        [PropertyName("customerId")]
        public int CustomerId { get; set; }
    
        [PropertyName("firstName")]
        [Text]
        public string FirstName { get; set; }
    
        [PropertyName("lastName")]
        [Text]
        public string LastName { get; set; }
    
        [PropertyName("email")]
        [Keyword]
        public string Email { get; set; }
        [PropertyName("customer_join_field")]
        public JoinField CustomerJoinField { get; set; }
    }
    
        [ElasticsearchType(Name = "order")]
        public class Order : Customer
        {
            [PropertyName("orderId")]
            public int OrderId { get; set; }        
    
            [PropertyName("orderAmount")]
            public decimal Amount { get; set; }
    
            [Nested]
            [PropertyName("packages")]
            public List<Package> Packages { get; set; }
    
            [Nested]
            [PropertyName("orderItems")]
            public List<OrderItem> OrderItems { get; set; }
    
        }
    
        public class Package
        {
            public int PackageId { get; set; }
            public int Qty { get; set; }
            public int OrderId { get; set; }
            public string Weight { get; set; }
        }
    
        public class OrderItem
        {
            public int OrderItemId { get; set; }
            public int Quantity { get; set; }
            public decimal UnitPrice { get; set; }
        }
    
    我查询此索引以获取特定客户(CustomerId=1)下的特定orderItem,单价为12.23

    这是我对DSL的查询

    {
    
        "query":{
    
            "parent_id":{
                "type":"order",
                "id":"1"
            },
                "nested":{
                "path":"orderItems",
                "score_mode":"avg",
                "query":{
                    "bool":{
                        "must":[
                              {"match":{"orderItems.unitPrice" : "12.23"}}
                            ]
                    }
                }
            }
        }
    }
    
    当我这样做时,我得到下面的eror消息

    {
        "error": {
            "root_cause": [
                {
                    "type": "parsing_exception",
                    "reason": "[parent_id] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                    "line": 9,
                    "col": 4
                }
            ],
            "type": "parsing_exception",
            "reason": "[parent_id] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
            "line": 9,
            "col": 4
        },
        "status": 400
    }
    
    我的问题是

  • 是否可以(或建议)同时处理父子关系和 ES6.x中的嵌套类型

  • 如果没有,我的选择是否仅限于对模型进行非规范化(有 package、OrderItems是Customer的子项,而不是Order和add 在Package和OrderItems中的字段?)

  • 这是我创建的示例数据(localhost:9200/fa/customer/\u search)


    我们最终为每个实体(客户、订单、包装等)创建了单独的索引,并从应用程序中查询所有这些索引,并将结果合并到应用程序中。这是我们与Elasticsearch合作的顾问的建议。我们没有在任何索引映射中处理父子关系。这可能对将来的人有帮助

    public static void AddCustomerDocument(Customer cust)
        {
            try
            {
                var result = ESClient.Index<Customer>(cust,
                     c => c
                     .Id(cust.CustomerId)//to avaoid random Ids
                     .Routing(cust.CustomerId)
                    );
    
                //var response = ESClient.Index(cust, i => i.Routing(Routing.From(cust)));
            }
            catch (Exception ex)
            {
    
                throw;
            }
        }   
    
    
    
    public static void AddOrderDocument(Order order)
        {
            try
            {
    
    
                var result = ESClient.Index<Customer>(order,
                     c => c
                     .Id(order.OrderId)//to avaoid random Ids
                     .Routing(order.CustomerId)
                    );
    
                //var response = ESClient.IndexDocument<Order>(order);
            }
            catch (Exception ex)
            {
    
                throw;
            }
        }
    
    {
        "fa": {
            "mappings": {
                "customer": {
                    "_routing": {
                        "required": true
                    },
                    "properties": {
                        "customerId": {
                            "type": "integer"
                        },
                        "customer_join_field": {
                            "type": "join",
                            "eager_global_ordinals": true,
                            "relations": {
                                "customer": "order"
                            }
                        },
                        "email": {
                            "type": "keyword"
                        },
                        "firstName": {
                            "type": "text"
                        },
                        "lastName": {
                            "type": "text"
                        },
                        "orderAmount": {
                            "type": "double"
                        },
                        "orderId": {
                            "type": "integer"
                        },
                        "orderItems": {
                            "type": "nested",
                            "properties": {
                                "orderItemId": {
                                    "type": "integer"
                                },
                                "quantity": {
                                    "type": "integer"
                                },
                                "unitPrice": {
                                    "type": "double"
                                }
                            }
                        },
                        "packages": {
                            "type": "nested",
                            "properties": {
                                "orderId": {
                                    "type": "integer"
                                },
                                "packageId": {
                                    "type": "integer"
                                },
                                "qty": {
                                    "type": "integer"
                                },
                                "weight": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    {
    
        "query":{
    
            "parent_id":{
                "type":"order",
                "id":"1"
            },
                "nested":{
                "path":"orderItems",
                "score_mode":"avg",
                "query":{
                    "bool":{
                        "must":[
                              {"match":{"orderItems.unitPrice" : "12.23"}}
                            ]
                    }
                }
            }
        }
    }
    
    {
        "error": {
            "root_cause": [
                {
                    "type": "parsing_exception",
                    "reason": "[parent_id] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                    "line": 9,
                    "col": 4
                }
            ],
            "type": "parsing_exception",
            "reason": "[parent_id] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
            "line": 9,
            "col": 4
        },
        "status": 400
    }
    
    {
        "took": 1,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 3,
            "max_score": 1,
            "hits": [
                {
                    "_index": "fa",
                    "_type": "customer",
                    "_id": "1",
                    "_score": 1,
                    "_routing": "1",
                    "_source": {
                        "customerId": 1,
                        "firstName": "Rennish",
                        "lastName": "Joseph",
                        "email": "rennish@yahoo.com",
                        "customer_join_field": "customer"
                    }
                },
                {
                    "_index": "fa",
                    "_type": "customer",
                    "_id": "100",
                    "_score": 1,
                    "_routing": "1",
                    "_source": {
                        "orderId": 100,
                        "orderAmount": 23.45,
                        "packages": [
                            {
                                "packageId": 1,
                                "qty": 2,
                                "orderId": 1,
                                "weight": "2.3"
                            },
                            {
                                "packageId": 2,
                                "qty": 1,
                                "orderId": 1,
                                "weight": "2.5"
                            }
                        ],
                        "orderItems": [
                            {
                                "orderItemId": 1,
                                "quantity": 2,
                                "unitPrice": 12.23
                            },
                            {
                                "orderItemId": 2,
                                "quantity": 1,
                                "unitPrice": 10.23
                            }
                        ],
                        "customerId": 1,
                        "customer_join_field": {
                            "name": "order",
                            "parent": "1"
                        }
                    }
                },
                {
                    "_index": "fa",
                    "_type": "customer",
                    "_id": "101",
                    "_score": 1,
                    "_routing": "1",
                    "_source": {
                        "orderId": 101,
                        "orderAmount": 23.45,
                        "packages": [
                            {
                                "packageId": 1,
                                "qty": 2,
                                "orderId": 1,
                                "weight": "2.3"
                            },
                            {
                                "packageId": 2,
                                "qty": 1,
                                "orderId": 1,
                                "weight": "2.5"
                            }
                        ],
                        "orderItems": [
                            {
                                "orderItemId": 1,
                                "quantity": 2,
                                "unitPrice": 12.23
                            },
                            {
                                "orderItemId": 2,
                                "quantity": 1,
                                "unitPrice": 10.23
                            }
                        ],
                        "customerId": 1,
                        "customer_join_field": {
                            "name": "order",
                            "parent": "1"
                        }
                    }
                }
            ]
        }
    }