簡體   English   中英

Berkeley DB的C ++浮索引查詢

[英]Berkeley DB C++ query on floating index

我在OSX上使用Berkeley DB C ++ API 6.0。 我的應用程序創建具有下列表格數據庫:

主表:(INT,MYSTRUCT) - > MYSTRUCT是一個緩沖區。

次級指數:(浮點,MYSTRUCT) - >浮關鍵是我與以下回調MYSTRUCT緩沖器檢索的信息。

int meanExtractor(Db *sdbp,
              const Dbt *pkey,
              const Dbt *pdata,
              Dbt *skey)
{
   Dbt data = *pdata;
   feature<float> f;
   restoreDescriptor(f, data);

   void* mean = malloc( sizeof(float) );
   memcpy( mean, &f.mean, sizeof(float) );

   skey->set_data(mean);
   skey->set_size(sizeof(float));
   skey->set_flags( DB_DBT_APPMALLOC );

   return 0;
}

當我遍歷二級索引和打印鍵/數據對時,浮子密鑰是公存儲。 我的問題是我無法查詢該表。 我想執行這個SQL查詢,例如:

SELECT * FROM secondary index WHERE keys > 1.5 && keys < 3.4

我的表由0.001和49.999之間的50000個鍵填充。 問題是,當我用這個方法,例如:

I assume the Db and the table are already opened
float i = 0.05;
Dbt key = Dbt(&i, sizeof(float));

Dbc* dbc;
db->cursor( txn, &dbc, 0 );
int ret;
ret = dbc->get( key, &vald, DB_SET_RANGE));

它的檢索此項:0.275。 應該找回0.05(因為它存在),或至少0.051。 而對於在DBT關鍵任何其他浮點值,它給了我一些愚蠢的值。 如果我把DB_SET標志,它只是沒有找到任何按鍵。 我的想法是,將光標到最小鍵大於或等於設置為我的鑰匙,然后直到我達到我的范圍的結束旗DB_NEXT進行迭代。 這必須來自的BerkeleyDB的搜索算法,但我看到了一些(有用的,但還不夠)的例子是做的正是我需要的,但與Java API,這樣就證明是可以做到的...

我與這個漂亮stucked,所以如果有人之前就已經有這個問題,THX對我的幫助。 如有必要,我可以將代碼的其他部分放入。

我在二級索引上使用了自定義bt_compare函數,現在可以正常使用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM