Как настроить prefix_same_as_start в read_options в RocksDbSharp - PullRequest
0 голосов
/ 22 сентября 2018

Я использую библиотеку RocksDbSharp , которая является реализацией RocksDb из facebook в C #.Я хотел бы отфильтровать свои записи по части ключа, но, к сожалению, я не вижу варианта, как это сделать.Вот пример кода:

static void Main(string[] args)
{
    string directory = @"C:\Path\To\RocksDB\Storage";

    DbOptions options = new DbOptions().SetCreateIfMissing(true);

    using (RocksDb rocksDb = RocksDb.Open(options, directory))
    {
        rocksDb.Put("AAAAB", "Test 1");
        rocksDb.Put("AAABB", "Test 2");
        rocksDb.Put("AABBB", "Test 3");
        rocksDb.Put("ABBBB", "Test 4");
        rocksDb.Put("BBBBB", "Test 5");

        List<string> keys = new List<string>();

        using (Iterator iterator = rocksDb.NewIterator())
        {
            iterator.Seek("AAB");

            while (iterator.Valid())
            {
                keys.Add(iterator.StringKey());

                iterator.Next();
            }
        }

        Console.WriteLine(string.Join(", ", keys));
        Console.ReadLine();
    }
}

Вывод:

AABBB, ABBBB, BBBBB

Как я могу изменить его, поэтому выводбудет только AABBB?Я прочитал Итератор вики и Префикс Seek API , что я могу сделать эту настройку prefix_same_as_start в true:

Если нет ключа префиксаравно или больше, чем lookup_key, или после вызова одного или нескольких Next () мы заканчиваем все ключи для префикса, мы можем вернуть Valid () = false или любой ключ, который больше предыдущего ключа, в зависимости от того, есть ли ReadOptions.prefix_same_as_start = true.

Кроме того, это объясняется в этом тикете :

Если вам нужны только ключи, начинающиеся с префикса 002, используйте read_options.prefix_same_as_start, который показывает ключи только с тем же префиксом, что и при поиске.

Как установить для этого свойства значение true?Если вы проверите реализацию ReadOptions класса , вы не найдете ничего, чтобы установить это свойство.У меня есть другие варианты фильтрации ключей?

1 Ответ

0 голосов
/ 24 сентября 2018

Чтобы получить через префикс, вы должны сначала создать префиксный экстрактор.

Options options;
options.prefix_extractor.reset(NewFixedPrefixTransform(<Length of the prefix>));

и откройте базу данных с помощью этих параметров.

Установите для prefix_same_as_start значение true в ReadOptions.

Вам может помочь следующий фрагмент (хотя и написано на C ++)

int main()
{
    DB *db;
    Options options;
    options.IncreaseParallelism();
    options.OptimizeLevelStyleCompaction();
    options.create_if_missing = true;
    options.prefix_extractor.reset(NewFixedPrefixTransform(3));

    Status s = DB::Open(options, kDBPath, &db);
    assert(s.ok());

    s = db->Put(WriteOptions(), "AAAAB", "value1");
    assert(s.ok());    
    s = db->Put(WriteOptions(), "AAABB", "value2");
    assert(s.ok());
    s = db->Put(WriteOptions(), "AABBB", "value3");
    assert(s.ok());
    s = db->Put(WriteOptions(), "ABBBB", "value4");
    assert(s.ok());
    s = db->Put(WriteOptions(), "BBBBB", "value5");
    assert(s.ok());

    ReadOptions read_options;
    read_options.prefix_same_as_start = true;

    Iterator *iter = db->NewIterator(read_options);
    iter->Seek("AAB");

    while (iter->Valid())
    {
        printf("key %s\n", iter->key().ToString().c_str());
        iter->Next();
    }

    delete iter;
    delete db;
    return 0;
}

Так как rocksdb написан на c ++, you might want to write a wrapper function для prefix_same_as_start, если его нет, и включите его.Для примеров функций-оболочек в собственном коде rockdb есть файлы c.cc/ch, которые записывают функции-обертки в C для различных опций roadsdb.Вы можете написать один на C #, чтобы удовлетворить ваши требования.:)

...