我可以在Elasticsearch中过滤子阵列吗?

时间:2017-03-16 15:24:23

标签: elasticsearch

我在Elastic Search中为每个订单附加订单和订购产品作为子阵列。当我汇总价格时,我需要在我的订单文件中过滤我的订单产品。

我在Elastic中的文档示例:

{  
   "OrderID":4567488,
   "projectId":"4",
   "Project":"direkt",
   "legacy_id":null,
   "supporterId":null,
   "Origin":"FR",
   "orderProducts":[  
      {  
         "OrderProductID":"15694898",
         "OrderID":"4567488",
         "brandNo":"30",
         "Price":"26.95",
      },
      {  
         "OrderProductID":"15694898",
         "OrderID":"4567488",
         "brandNo":"15",
         "Price":"15.22",
      },
       {  
         "OrderProductID":"15694898",
         "OrderID":"4567488",
         "brandNo":"123",
         "Price":"24.55",
      },
   ]
}

现在如何过滤:

 {  
      "index":"order_index",
      "from":0,
      "size":100,
      "body":{  
         "query":{  
            "filtered":{  
               "filter":{  
                  "bool":{  
                     "must":[  
                        {  
                           "term":{  
                              "orderProducts.brandNo":"30"
                           }
                        }
                     ],
                  }
               }
            }
         }
      }
   }

我期待什么

{  
   "OrderID":4567488,
   "projectId":"4",
   "Project":"direkt",
   "legacy_id":null,
   "supporterId":null,
   "Origin":"FR",
   "orderProducts":[  
      {  
         "OrderProductID":"15694898",
         "OrderID":"4567488",
         "brandNo":"30",
         "Price":"26.95",
      },
   ]
}

我真正得到的是:

所有文件。

这可能吗?过滤子数组数据?

UPD。

是的,这是我的架构映射:

"mappings":{  
   "order":{  
      "dynamic_templates":[  
         {  
            "strings":{  
               "mapping":{  
                  "type":"string",
                  "fields":{  
                     "raw":{  
                        "index":"not_analyzed",
                        "type":"string"
                     }
                  }
               },
               "match_mapping_type":"string"
            }
         }
      ],
      "properties":{  
         "orderProducts":{  
            "include_in_parent":true,
            "properties":{  
               "OrderProductID":{  
                  "type":"long"
               },
               "OrderID":{  
                  "type":"long"
               },
               "brandNo":{  
                  "type":"long"
               },
               "Price":{  
                  "type":"double"
               }

            },
            "type":"nested"
         },
         "OrderID":{  
            "type":"long"
         }
      }
   }
},

1 个答案:

答案 0 :(得分:0)

好吧,经过一些实验,我发现聚合可以像这样完成:

 {  
   "aggs":{  
      "sales":{  
         "nested":{  
            "path":"orderProducts"
         },
         "aggs":{  
            "filtered_nestedobjects":{  
               "filter":{  
                  "bool":{  
                     "must":[  
                        {  
                           "terms":{  
                              "orderProducts.brandNo":[  
                                 "30"
                              ]
                           }
                        }
                     ]
                  }
               },
               "aggs":{  
                  "Quantity":{  
                     "sum":{  
                        "field":"orderProducts.Quantity"
                     }
                  }
               }
            }
         }
      }
   }
}

主要问题的答案是否可以过滤弹性的子阵列。只有inner_hits才能做到这一点。