我有一个用例,其中包括在一个属性下存储多个地图。这是等效的 JSON 列表:
[
{"tel": "+33123456789", "type": "work"},
{"tel": "+33600000000", "type": "mobile"},
{"tel": "+79001234567", "type": "mobile"}
]
另外,我希望它可以在对象级别进行搜索。例如: - 搜索具有手机号码的条目 - 搜索具有手机号码且其号码以字符串“+7”开头的条目
由于 Riak 不支持映射集(但只支持寄存器集),我想知道是否有实现它的技巧。到目前为止,我有 2 个想法
地图地图
这个想法是为对象生成(随机?)键,并将列表中的每个对象存储在父映射中,其键是为此唯一目的而生成的键。
在我看来,它不允许搜索对象(父地图内的地图),因为 Riak Solr 搜索需要属性的完整路径。不能简单地编写以下 Solr 查询:phone_numbers.*.tel:+7*
. 组合搜索(例如,具有手机号码且号码以字符串“+7”开头的搜索条目)似乎很难实现。
具有模拟多值属性的集合
该解决方案包括使用一个集合并将对象的所有值作为单个字符串插入,它们之间有分隔符。是的,这是一个黑客。属性值看起来像:$tel:+79001234567$type:mobile$
作为:
属性名称-值分隔符和$
作为属性分隔符。
使用通配符搜索可能是可行的*
(丑陋,但仍然),除了转义分隔符的问题:如果 type 属性包含 a:
怎么办?它们是否是一些被 Riak 接受并且在字符串中不可接受的分隔符(我正在考虑控制字符)?
简而言之
我正在寻找一种解决方案,无论它有什么骇人听闻的东西,只要它有效。欢迎任何想法。