如何在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'sList'sObject'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/

10-13 03:25