0

如何在 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 是否支持任何类型的批量插入?我无法找到解决方案,所以我通过合并数据手动执行此操作。

4

1 回答 1

2

在 Riak 中存储复杂的数据结构不需要做任何特别的事情。Java 客户端支持序列化为 JSON(杰克逊,因此您可以使用杰克逊功能,例如注释)。

我建议使用 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'sof Object's

但请记住,如果您要更新、添加或删除单个订单,或更改客户日期,您将必须阅读整个列表,更改项目,然后将整个列表写回,这可能会增加机会冲突(对同一密钥的并发更新)。

Solr 绝对支持复杂的字段结构、多值和动态字段。看看创建搜索模式。我需要知道你想要搜索的数据的哪一部分给你一个例子。

不,Riak 不支持批量插入。

更新:在您的情况下,用于按订单 ID 进行索引的自定义(非通用)Solr 架构应包括

<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />
于 2016-08-15T19:18:45.727 回答