Riak 插入列表

Riak inserting Lists

如何在 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 写入。当我们的消息系统开始推送数千个 messages/sec 时,这就成为瓶颈。因此,这里的目的(某种 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);

或者,您可以将其建模为 Object'sMap'sList's

不过请记住,如果您想要更新、添加或删除单个订单,或者更改客户日期,您将必须阅读整个列表,更改一个项目,然后将整个列表写回,可能会增加发生冲突的可能性(同时更新同一键)。

Solr绝对支持复杂字段结构、多值和动态字段。看看 Creating Search Schemas。我需要知道你希望搜索你的数据的哪一部分来给你举个例子。

不,Riak 不支持批量插入。

更新:在您的案例中,用于按订单 ID 进行索引的自定义(非通用)Solr 模式应包括

<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />