我有两个必须分开的索引:
// 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"
}
答案 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
用例也是使用
在第一种情况下,您有一个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
}
]
}'