3

将 bitcask 与 riak 一起使用,我有明确定义的键名,我正在使用键过滤器在 map-reduce 查询中进行过滤。这是一个使用带有 bitcask 的关键过滤器来实现 2i 功能的实验(然后使用二级索引与使用关键过滤器比较我的应用程序的性能)。

Riak 密钥过滤器文档

给定一个包含其名称格式的键的存储桶,version_type_user_timestamp我最终得到如下所示的键。

GET /riak/my_example_bucket?keys=stream HTTP/1.1
Host: localhost
Accept: application/json

{
    "keys": [
        "v0.3_demo.type.1_user12345_1375315200000",
        "v0.3_demo.type.1_user10000_1375315200973",
        "v0.3_demo.type.4_user00288_1375315101004",
        ...
    ]
}
{
    "keys": [
        "v0.3_demo.type.2_user12777_1375315211000",
        "v0.3_demo.type.1_user12777_1375315211782",
        "v0.3_demo.type.2_user50121_1375315101004",
        ...
    ]
}
...

我正在构建如下所示的关键过滤器。这个想法是通过事先按键过滤结果来减少值查找。

{
    "bucket": "my_example_bucket",
    "key_filters": [
        [
            "or",
            [
                [
                    "tokenize",
                    "_",
                    2
                ],
                [
                    "eq",
                    "demo.type.1"
                ]
            ],
            [
                [
                    "or",
                    [
                        [
                            "tokenize",
                            "_",
                            2
                        ],
                        [
                            "eq",
                            "demo.type.2"
                        ]
                    ],
                    [
                        [
                            "or",
                            [
                                "tokenize",
                                "_",
                                2
                            ],
                            [
                                "eq",
                                "demo.type.3"
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
}

这种技术有效,但请注意它如何标记每个["or", [...], [...]]子句的键。我的假设是,如果我可以标记一次并将结果输入到or子句管道中,所有测试接受的标记变体,那么 map-reduce 查询的关键过滤器将做更少的工作(因此映射的过滤部分-reduce 查询将花费更少的时间)。

我试过像下面这样格式化请求,但这似乎不起作用。

{
    "bucket": "my_example_bucket",
    "key_filters": [
        [
            "tokenize",
            "_",
            2
        ],
        [
            "or",
            [
                "eq",
                "demo.type.1"
            ],
            [
                "or",
                [
                    "eq",
                    "demo.type.2"
                ],
                [
                    "eq",
                    "demo.type.3"
                ]
            ]
        ]
    ]
}

有没有办法在不重新标记每个or子句的情况下做到这一点?

4

1 回答 1

3

您可能可以使用matches过滤器和正则表达式获得所需的功能。我生成了一些假数据

for i in {1..100}; do curl localhost:8098/buckets/BUCKET/keys/${RANDOM}_${Text[$(($RANDOM / 8196))]}_$i -H "content-type: text/plain" -XPUT -d "$i - $RANDOM"; done

所以 BUCKET 包含 100 个形式的键
<random number from 0 - 32776>_(AB|DE|FF|RB)_<number from 1 to 100>

然后我使用正则表达式构造了一个查询,以提取随机数以 1、2 或 8 开头的所有键,中间的字符串是“DE”,键索引为 80 或更少,如下所示:

{
    "inputs":{
         "bucket":"BUCKET",
         "key_filters":[
              ["matches","^[128][^_]*_DE_[1-8].?$"]
         ]
    },
    "query":[{
        "map":{
              "language":"javascript",
              "source":"function(rObject){return [rObject.key]}"
              }
        }
    ]}

返回

["8461_DE_69","11823_DE_34","21302_DE_83","17568_DE_6","10066_DE_22",
 "1973_DE_68","15742_DE_54","8027_DE_29","25593_DE_50",
 "15301_DE_43","21039_DE_63","24454_DE_39","10350_DE_42","17432_DE_11",
 "15588_DE_2","16895_DE_80","28046_DE_18","14872_DE_75"]

如果您可以在正则表达式中表达您要匹配的内容,那么这可能对您有用,而且步骤更少。

对于您的示例,您可能会使用以下内容:

[["matches","^[^_]*_demo[.]type[.][123]_.*$"]]
于 2013-08-13T22:19:27.707 回答