0

Does Kyoto Cabinet support searching for a range of keys? If so, what types of keys do support range search? Can I do range search on a long (64bit) key?

Thanks RG

nightwatch
  • 1,276
  • 2
  • 18
  • 27
  • And if you know another key-value store that a) supports binary keys and values b) supports key range search then please let me know – nightwatch Mar 15 '12 at 09:32

4 Answers4

0

it supports key prefix query, however, the efficiency of prefix query depends on what internal storage structure is. If you are using hashdb, it may be not a good idea, as keys & values are scattered around in the underline file.

zach
  • 184
  • 2
  • 8
0

Yes, for integers.

B+ tree database supports sequential access in order of the keys, which realizes forward matching search for strings and range search for integers - from docs

rtxndr
  • 872
  • 1
  • 9
  • 20
0

Yes you can, you just need a forward jump.

An example using C. Stores 5 records with 64 bits keys (from 1 to 5) and then apply a filter (from 2 to 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;
}
David Ranieri
  • 39,972
  • 7
  • 52
  • 94
-2

LevelDB supports binary keys and ranged queries.

Edit: I forgot to mention that in order for the range query to work, the binary value needs to be packed in a comparable way. For your long example, you need to make sure it's big-endian encoded.