OnceDB 是基于 Redis 实现的全文搜索数据库。
我们一直在开发一款能够在 ARM 和 x86 平台上都能运行的知识管理软件。
低端 Arm 开发板的 TF 存储卡读写速度其实非常有限,只有 Redis 这样的内存数据库,才能够在 NAS 持续向外传送文件时,依然保持非常优异的并发能力,而不会造成 Web 服务不可用。
但直接使用 Redis 非常不方便,所以我们修改了 Redis 的源码,使之可以像 SQL 数据库那样,实现全文搜索,多条件查询,并可自动创建辅助索引,提高数据搜索的性能,并大幅提高开发效率。
项目地址: http://oncedb.com
在 Github 上下载最新的安装包,解压运行即可。
https://github.com/OnceDoc/OnceDB/releases/
OnceDB 并不改变 Redis 的数据存储结构,Redis 数据库文件可以直接在 OnceDB 中操作,然后再返回 Redis 中使用。所以可以直接使用目前的第三方 Redis 客户端来测试 OnceDB 的指令,您可以选择您熟悉的第三方工具或者 redis-cli 命令行来测试 OnceDB。
在 Windows 上启动 oncedb-server.exe ,打开 Redis 客户端,执行命令:
upsert user username @ dota password = 123456 title ? dev skill * c,node.js age / 18
然后我们看到,OnceDB 自动创建了一条 user:dota 的 HASH 数据:
同时也自动创建了一些索引:
keys *
1) "*user.skill:c"
2) "user:dota"
3) "*user.title:dev"
4) "*user"
5) "*user.skill:node.js"
6) "*user.age"
这些索引以 '*' 开头,均为 zset 有序列表 :
zrange *user 0 -1 withscores
1) "dota"
2) "1582158759852"
其中权重默认为当前的操作时间。
OnceDB 通过操作符来自动创建这些索引。比如
@ 操作符代表的是主键,所有索引存放的都是主键的值。 ? 代表的是分组索引,会自动创建一条按值存在的分组,如 *user.title:dev * 代表的是多分组(关键字)索引,使用 ',' 分隔 / 代表提是排序索引,会按值排序,如 *user.age
可使用 find 指令搜索数据,比如搜索 skill 含 node.js 关键字的数据,并打印 username, password 字段:
find user 0 -1 username = * password = * skill * node.js
1) "1"
2) "user:dota"
3) "dota"
4) "123456"
5) "c,node.js"
第一行返回的 "1" 代表启用了索引搜索,符合条件的数据总数是 1。如果返回 -1 则表明使用的全文搜索,比如,查询含有 'js' 的数据
find user 0 -1 username = * password = * skill ~ js
1) "-1"
2) "user:dota"
3) "dota"
4) "123456"
5) "c,node.js"
关于更多指令说明可杳看帮助文档:
OnceOA 知识管理. 的介绍可参见这篇知乎问答
同时 oncedb 的 node.js 驱动引擎也将于近期发布,未完待续...