web-dev-qa-db-ja.com

ElasticSearchで2つのインデックスを「結合」する方法

分離する必要がある2つのインデックスがあります。

// 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"
}

検索でこれらの2つのテーブルを「結合」して、次の行に沿って何かを返すにはどうすればよいですか。

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"
}
13
David542

他の質問 で回答したように、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. 親/子関係
  2. または ネストされたオブジェクト

最初のケースでは、order「親」ドキュメントが1つあります...

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
}'

2番目の場合、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
      }
    ]
}'
15
Val