【问题标题】:Riak: search by key prefixRiak:按关键字前缀搜索
【发布时间】:2014-12-17 10:23:16
【问题描述】:

我是 Riak 的新手,我一直在阅读 riak 文档中的 this 章节。它表明,通过向桶和键添加结构信息,可以克服键/值操作的一些限制。

虽然文章举例说明了如何构建此类密钥:

传感器数据键可以以 sensor_ 或 temp_sensor1_ 开头,后跟时间戳 (例如sensor1_2013-11-05T08:15:30-05:00)

没有提到如何通过键前缀(例如sensor1_)查询数据的方法。环顾stackoverflow,我发现this 问题。其中提到了 MapReduce 和密钥过滤作为一种可能的解决方案。但是关键过滤器上的documentation 声明它们是一个即将被弃用的功能。我还检查了 Riak 搜索作为一种可能的方式,但无法找到通过键前缀查询数据的方法。

我的问题是:通过键前缀搜索数据的最佳方法是什么?我将不胜感激。

【问题讨论】:

    标签: erlang riak riak-search


    【解决方案1】:

    搜索键前缀的最佳方法是在不需要时不要这样做,即尽可能围绕该搜索模式进行设计。这样做的主要方法是使用您的应用程序可以轻松计算的确定性密钥。也就是说,如果您无法避免构建应用程序以要求搜索键前缀,那么您可以做几件事(所有这些都有其缺点)。

    1. 关键过滤器 - http://docs.basho.com/riak/latest/dev/references/keyfilters/ - 正如您已经注意到的,这些已被标记为已弃用,此时不推荐使用。
    2. MapReduce - http://docs.basho.com/riak/latest/dev/advanced/mapreduce/ - 如果您可以批量查询但不适合实时查询,这是一个不错的选择。如果预先计算查询有帮助,您可以缓存查询结果。
    3. Riak Search 2.0 (Solr) - http://docs.basho.com/riak/latest/dev/using/search/ - 从应用程序的角度来看,这可能是最容易实现的方法,并且允许使用以下查询查询您的密钥:'curl "$RIAK_HOST/search/sensor? wt=json&q=_yz_rk:sensor1_*"'。使用搜索确实会影响基于直接键的查询的性能,但您可以缓存查询。
    4. 数据建模 - 直接按键查询总是会提供最好的性能,如上所述。一种选择是利用 Riak 的数据类型 (CRDT) 并创建一个使用集合的存储桶。您可以为每个传感器创建一个集合,其中包含与第一个存储桶中该传感器关联的键列表。然后,您可以遍历集合中的键并执行多次获取以返回所有关联的记录。

    希望这能给你一些想法。

    【讨论】:

    • 为@Craig 的数据建模思想添加另一个选项:在时间段内聚合键。与其将每个传感器值写入其自己的键中,不如将它们分组为一个键/值对,其中包含 1 分钟内的所有传感器值(或任何适合您的大小)。然后,您就有了定义明确的可预测键,无需扫描即可对其进行迭代。
    • @Craig 感谢您的全面回答。但仍然想知道,如果 Riak 的设计师推荐这种搜索模式,为什么没有任何直接的方法来实现它?不推荐使用的密钥过滤器除外。
    • @NikolayManolov 好问题。重要的是要记住,Riak 用来在集群中均匀分布数据的机制使得本地迭代密钥变得困难。这就是为什么不建议在生产中使用 List Keys 操作(它非常昂贵)。如果你不能围绕这个问题进行设计,我会推荐 Solr,然后是 MapReduce。
    • 建议创建有意义的键名,您可以预测并因此迭代获取,而不是创建可过滤的键名,您必须执行搜索操作才能确定您想要哪些键。例如,如果您知道每分钟都应该有传感器数据,并且想要某一天的所有传感器读数,那么您可以循环并获取 1440 个键,而无需搜索任何内容。如果您想对它们运行批处理,请将键作为输入传递给 map reduce 作业。
    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2011-02-06
    • 2020-02-07
    • 2012-07-24
    相关资源
    最近更新 更多