京都内阁支持关键范围搜索?

时间:2012-03-15 09:30:04

标签: nosql key-value tokyo-cabinet kyotocabinet

Kyoto Cabinet是否支持搜索一系列密钥? 如果是这样,哪种类型的键支持范围搜索? 我可以在长(64位)密钥上进行范围搜索吗?

由于 RG

4 个答案:

答案 0 :(得分:0)

它支持密钥前缀查询,但前缀查询的效率取决于内部存储结构。如果您正在使用hashdb,那么它可能不是一个好主意,因为键和&值分散在下划线文件中。

答案 1 :(得分:0)

是的,对于整数。

B +树数据库支持按键顺序进行顺序访问,实现字符串的前向匹配搜索和整数的范围搜索 - 来自docs

答案 2 :(得分:0)

是的,你可以,你只需要向前跳。

使用C的示例使用64位密钥(从1到5)存储5条记录,然后应用过滤器(从2到4):

#include <kclangc.h>
#include <inttypes.h>

int main(void)
{
    KCDB *db;
    KCCUR *cur;
    char *kbuf;
    size_t ksiz, vsiz;
    const char *cvbuf;
    int64_t i, val, min, max;
    int64_t keys[] = {1, 2, 3, 4, 5};
    const char *values[] = {"one", "two", "three", "four", "five"};
    char i64[8]; /* A buffer to store byte sequences */

    /* create the database object */
    db = kcdbnew();
    /* open the database */
    if (!kcdbopen(db, "db64.kct", KCOWRITER | KCOCREATE)) {
        fprintf(stderr, "open error: %s\n", kcecodename(kcdbecode(db)));
    }
    /* store records */
    for (i = 0; i < 5; i++) {
        memcpy(i64, &keys[i], 8);
        if (!kcdbset(db, i64, 8, values[i], strlen(values[i]))) {
            fprintf(stderr, "set error: %s\n", kcecodename(kcdbecode(db)));
            exit(EXIT_FAILURE);
        }
    }
    /* traverse records */
    min = 2;
    max = 4;
    printf("Range from %" PRId64 " to %" PRId64 "\n", min, max);
    memcpy(i64, &min, 8);
    cur = kcdbcursor(db);
    kccurjumpkey(cur, i64, 8);
    while ((kbuf = kccurget(cur, &ksiz, &cvbuf, &vsiz, 1)) != NULL) {
        memcpy(&val, kbuf, 8);
        if (val > max) {
            break;
        }
        printf("Found %s\n", cvbuf);
        kcfree(kbuf);
    }
    kccurdel(cur);
    /* close the database */
    if (!kcdbclose(db)) {
        fprintf(stderr, "close error: %s\n", kcecodename(kcdbecode(db)));
    }
    /* delete the database object */
    kcdbdel(db);
    return 0;
}

答案 3 :(得分:-2)

LevelDB支持二进制密钥和远程查询。

编辑:我忘了提到为了使范围查询起作用,二进制值需要以类似的方式打包。对于您的长期示例,您需要确保它是大端编码。