如何在Riak中插入地图列表?我还可以通过Solr查询列表。
这是我的目标数据模型:
{
"id":"fa0b758cf8de4a40a54f215563bb483c",
"version":"g2wAAAABaAJtAAAADN4oTJvAfuENAAE8fWEBag==",
"creator":"ADMIN",
"creatorAppId":"RIAK_QA_APP1",
"creation":1470350862095,
"customerId":"68af96dae60ccac4e6",
"customerName":"John Appleseed",
"orders":[
{
"orderId":"238dhu38ehj",
"orderType":"sporting",
"orderDescription":"Baseball Batt",
"dateOfPurchase":"5470354262012",
"delivery":"2 day express",
"processTimeMS":56,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"9sdjh349hn",
"orderType":"furniture",
"orderDescription":"Sectional Couch",
"dateOfPurchase":"0970354262087",
"delivery":"Overnight",
"processTimeMS":78,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"1009shdj473",
"orderType":"gaming",
"orderDescription":"FIFA 2016 - XBox One",
"dateOfPurchase":"1470354342013",
"delivery":"UPS Ground",
"processTimeMS":68,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
}
]
}
当前数据模型分别保留每个订单项,从而导致大量Riak写操作。当我们的消息传递系统开始每秒处理数千条消息时,这将成为瓶颈。因此,此处的目的(某种POC)是将每个客户的所有订单商品合并到
"orders"
列表中,并作为单个资源保存。类似于批处理。关于这一点,Riak是否支持任何类型的批处理插入?我找不到解决方案,所以我有点通过合并数据来手动执行此操作。
最佳答案
您无需执行任何特殊操作即可在Riak中存储复杂的数据结构。 Java客户端支持对JSON的序列化(就此而言,为Jackson,因此您可以使用Jackson功能,例如注释)。
我建议您使用DTO对数据建模,然后通过Riak的StoreValue
命令将其发送。这样的代码将起作用:
public class CustomerData {
private String id;
private String version;
// other customer fields
private List<Order> orders;
}
public class Order {
private String orderId;
private String orderType;
// other order fields
}
CustomerData data = ...;
Location location = new Location(new Namespace(BUCKET_TYPE, BUCKET_NAME), key);
StoreValue storeCommand = new StoreValue.Builder(data).withLocation(location).build();
riakClient.execute(storeCommand);
或者,您可以将其建模为
Map's
的List's
和Object's
。但是请记住,如果要更新,添加或删除单个订单或更改客户日期,则必须阅读整个列表,更改项目,然后再写回整个列表,这可能会增加机会冲突(同时更新同一密钥)。
Solr绝对支持复杂的字段结构,多值和动态字段。看看Creating Search Schemas。我需要知道您希望搜索数据的哪一部分,以举一个例子。
不,Riak不支持批量插入。
更新:在您的情况下,用于按订单ID进行索引的自定义(非通用)Solr模式应包括
<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />
关于java - Riak插入列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38960894/