浮动索引上的 Berkeley DB C++ 查询

Posted

技术标签:

【中文标题】浮动索引上的 Berkeley DB C++ 查询【英文标题】:Berkeley DB C++ query on floating index 【发布时间】:2014-03-20 13:44:19 【问题描述】:

我在 OSX 上使用 Berkeley DB C++ API 6.0。 我的应用程序创建了一个包含以下表格的数据库:

主表:(int, myStruct) -> myStruct 是一个缓冲区。

二级索引:(float, 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,因此证明这是可能的......

我很坚持这个问题,所以如果之前有人遇到过这个问题,谢谢你的帮助。如有必要,我可以放置我的代码的其他部分。

【问题讨论】:

【参考方案1】:

我在二级索引上使用了一个自定义 bt_compare 函数,它现在可以完美运行。

【讨论】:

以上是关于浮动索引上的 Berkeley DB C++ 查询的主要内容,如果未能解决你的问题,请参考以下文章

berkeley DB:无法编译 C++ 代码

使用 Berkeley DB、C++ STL 接口进行批量读取

Berkeley-DB:多个数据库上的原子事务

检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]

Berkeley DB为啥又叫做db4

查询 Berkeley DB 中的模式实现