如何在ElasticSearch中"加入"两个索引

Dav*_*542 11 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"
}
Run Code Online (Sandbox Code Playgroud)

我将如何在搜索中"加入"这两个表格,以便它返回以下内容:

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"
}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 15

正如您在其他问题中所解释的那样,没有什么可以阻止您在索引时将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"
}
Run Code Online (Sandbox Code Playgroud)

此解决方案的优点是每个订单项都是完全独立的,您可以对它们进行分组/聚合OrderID,以获取给定订单的所有项目.

另外,正如@JohnAment在评论中提到的,order/order_item用例也是使用其中任何一个的好选择

  1. 父/子关系
  2. 嵌套对象.

在第一种情况下,你有一个order"父"文件......

curl -XPUT localhost:9200/orders/order/82 -d '{
    "ID": 82,
    "Customer": "John Smith"
}'
Run Code Online (Sandbox Code Playgroud)

以及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
}'
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,您的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
      }
    ]
}'
Run Code Online (Sandbox Code Playgroud)