如何加入' ElasticSearch中的两个索引

时间:2015-10-25 21:30:04

标签: json elasticsearch

我有两个必须分开的索引:

// index = `order_item`
{
    "ID": 1,
    "Name": "Shoes",
    "Price": 9.99,
    "OrderID": 82
},{
    "ID": 1,
    "Name": "Hat",
    "Price": 19.99,
    "OrderID": 82
}

// index = `order`
{
    "ID": 82,
    "Customer": "John Smith"
}

我将如何加入'这两个表在搜索上,这样就会返回以下内容:

results = {
    "ID": 1,
    "Name": "Shoes",
    "Price": 9.99,
    "Order.ID": 82,
    "Customer": "John Smith"
},{
    "ID": 1,
    "Name": "Hat",
    "Price": 19.99,
    "Order.ID": 82,
    "Customer": "John Smith"
}

1 个答案:

答案 0 :(得分:14)

正如在your other question中所回答的,没有任何内容可以阻止您在索引时将Customer名称存储在每个order_item文档中,同时仍然有一个专用索引orders也包含Customer数据。请记住,所有这些都是为了巧妙地对您的数据进行非规范化处理,以便您的每个文档都是自包含的"如你所愿。

curl -XPUT localhost:9200/order_items/order_item/1 -d '{
    "ID": 1,
    "Name": "Shoes",
    "Price": 9.99,
    "OrderID": 82,
    "Customer": "John Smith"
}'

curl -XPUT localhost:9200/order_items/order_item/2 -d '{
    "ID": 2,
    "Name": "Hat",
    "Price": 19.99,
    "OrderID": 82,
    "Customer": "John Smith"
}

此解决方案的优点是每个订单商品都是完全独立的,您可以在OrderID上对它们进行分组/汇总,以获取给定订单的所有商品。

另外,正如@JohnAment在评论中提到的那样,order/order_item用例也是使用

的好选择。
  1. parent/child relationship
  2. nested objects
  3. 在第一种情况下,您有一个order"父母"文件...

    curl -XPUT localhost:9200/orders/order/82 -d '{
        "ID": 82,
        "Customer": "John Smith"
    }'
    

    还有几个order_item"孩子"使用父ID编制索引的文档:

    curl -XPUT localhost:9200/order_items/order_item/1?parent=82 -d '{
         "ID": 1,
         "Name": "Shoes",
         "Price": 9.99
    }'
    curl -XPUT localhost:9200/order_items/order_item/2?parent=82 -d '{
         "ID": 2,
         "Name": "Hat",
         "Price": 19.99
    }'
    

    在第二种情况下,您的order文档将包含嵌套OrderItems属性中的所有订单商品,如下所示:

    curl -XPUT localhost:9200/orders/order/82 -d '{
        "ID": 82,
        "Customer": "John Smith"
        "OrderItems": [
          {
            "ID": 1,
            "Name": "Shoes",
            "Price": 9.99
          },{
            "ID": 2,
            "Name": "Hat",
            "Price": 19.99
          }
        ]
    }'