3

riak で bitcask を使用すると、キー フィルターを使用して 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 クエリの主要なフィルター部分が行う作業が少なくなるというものです (したがって、map のフィルタリング部分は-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 に答える