Nosql 如何使用Berkeley DB的非SQL键/值API实现模糊查询(如关键字)

Nosql 如何使用Berkeley DB的非SQL键/值API实现模糊查询(如关键字),nosql,berkeley-db,fuzzy-search,Nosql,Berkeley Db,Fuzzy Search,我可以理解这一点,但它似乎无法应用于这样的情况,即使用Berkeley DB的非SQL键/值API实现SELECT*FROM表,其中的名称为“%abc%” 我想迭代所有记录不是一种有效的方法,但它确实起到了作用。你是对的。如果没有任何其他表,则必须扫描所有条目并测试每个数据项。在很多情况下,事情就这么简单 如果您使用的是类似SQL的,我怀疑您是否能够做得更好,除非您的数据项具有定义良好的结构 但是,如果像%abc%这样的WHERE名称查询实际上是WHERE name=abc,那么除了主表之外,您

我可以理解这一点,但它似乎无法应用于这样的情况,即使用Berkeley DB的非SQL键/值API实现SELECT*FROM表,其中的名称为“%abc%”


我想迭代所有记录不是一种有效的方法,但它确实起到了作用。

你是对的。如果没有任何其他表,则必须扫描所有条目并测试每个数据项。在很多情况下,事情就这么简单

如果您使用的是类似SQL的,我怀疑您是否能够做得更好,除非您的数据项具有定义良好的结构

但是,如果像%abc%这样的WHERE名称查询实际上是WHERE name=abc,那么除了主表之外,您还可以选择对db_put调用进行性能惩罚,以创建反向索引:

------------------------------------------- key(name) data(index) ------------------------------------------- abc 0 abcd 1 sabcd 4 spring 3 timeab 5 you 2 此表按字母顺序排序,需要一个词法键比较函数,并使用对BDB中重复键的支持。现在,要找到输入项的键,只需执行db_get abc,或者更好,在abc上打开一个带有db_SETRANGE的光标


根据您需要执行的类似查询的类型,您可能可以使用反向索引技术来缩小搜索空间。

假设我想模糊搜索包含ab的字符串,但是当迭代器运行时,spring是个障碍,在这种情况下,timeab似乎无法命中,也就是说,我只能得到abc、abcd和可能的sabcd,对吧?在这种情况下是对的。但如果zabc在里面,它会排在最后,在你之后。如果您在第一次不匹配时结束对%abc%的搜索,您将错过它。 ------------------------------------------- key(name) data(index) ------------------------------------------- abc 0 abcd 1 sabcd 4 spring 3 timeab 5 you 2