C# Elasticsearch 6.x中连接类型与嵌套类型的组合及查询
总之,我正在使用ElasticSearch 6.x和NEST,为了简单起见,我根据这里提供的NEST 6.x文档创建了具有以下POCO设置的映射。我的数据模型是一个简单的模型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; }
- 顾客
- 命令
- 包装
- 订单项
这是C#POCO设置
我查询此索引以获取特定客户(CustomerId=1)下的特定orderItem,单价为12.23 这是我对DSL的查询[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; } }
当我这样做时,我得到下面的eror消息{ "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 }
- 是否可以(或建议)同时处理父子关系和 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"
}
}
}
]
}
}