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
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
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.
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
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;
}
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.