OnceDB 更新:在 Redis 中实现 SQL 数据库的多条件关联查询,内、外连接合并索引搜索使用教程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
newghost

OnceDB 更新:在 Redis 中实现 SQL 数据库的多条件关联查询,内、外连接合并索引搜索使用教程

  •  
  •   newghost
    newghost 2020 年 3 月 12 日 1672 次点击
    这是一个创建于 2235 天前的主题,其中的信息可能已经有所发展或是发生改变。

    OnceDB 是基于 Redis 二次开发的全文搜索内存数据库,支持像 SQL 关系数据库和 NoSQL 无模式数据库那样管理数据,目前还在不断更新完善中。

    介绍可参考: OnceDB 内存数据库引擎

    条件查询

    在 OnceDB 的 node.js 驱动中,可直接使用类似 mongodb 的查询语法,来查询 redis 数据库:

    oncedb.select(schemaName, query, options, callback) 

    示例,准备测试数据:

    (async() => { const util = require('util') const Oncedb= require('oncedb')() // priomise 化接口,使用顺序语法执行异步函数 const upsert = util.promisify(oncedb.upsert).bind(oncedb) const select = util.promisify(oncedb.select).bind(oncedb) const zrange = util.promisify(oncedb.client.zrange).bind(oncedb.client) // 定义 blog: id 自增 ID, user 分组索引, keys 关键字索引, visit 排序索引 oncedb.schema('blog', { id: 'id;sequence', user: 'group', keys: 'keywords', visit: 'sort' }) // 添加测试数据 await upsert('blog', { user: 'fire', keys: 'c,java,js', visit: 3899 }) await upsert('blog', { user: 'fire', keys: 'go,c,js', visit: 1000 }) await upsert('blog', { user: 'like', keys: 'java,c,node.js', visit: 1200 }) await upsert('blog', { user: 'like', keys: 'node.js,go,c', visit: 3206 }) await upsert('blog', { user: 'mind', keys: 'js,go,c', visit: 2106 }) await upsert('blog', { user: 'fire', keys: 'java,js,go,c', visit: 9999 }) })(); 

    多条件查询, { user: 'fire', keys: 'c' }, 并且 visit 在 1000 和 4000 之间的数据:

    var rows = await select('blog', { user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] }) console.log(rows) 

    输出结果:

    [ { _key: 'blog:2', id: '2', user: 'fire', keys: [ 'go', 'c', 'js' ], visit: '1000' }, { _key: 'blog:1', id: '1', user: 'fire', keys: [ 'c', 'java', 'js' ], visit: '3899' } ] 

    连接查询

    OnceDB 最新版添加了连接查询的功能,可以用数组实现多条件连接查询.

    多条件查询的前提是搜索的字段在 schema 中都被定义成了索引,这样在 OnceDB 中可以通过一系列的交集和并集运算来提取数据,语法如下:

    oncedb.select ([query1, query2 ...], options, cb) 

    oncedb.select ([[query1, options1], [query2, options2] ...], options, cb) 

    比如当两个搜索条件求其合集,并按 visit 排序:

    var rows = await select('blog', [ [{ user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] }] , [{ user: 'like', keys: 'java' }, { sort: 'visit' }] ]) console.log(rows) 

    输出结果:

    [ { _key: 'blog:2', _score: 1000, id: '2', user: 'fire', keys: [ 'go', 'c', 'js' ], visit: '1000' }, { _key: 'blog:3', _score: 1200, id: '3', user: 'like', keys: [ 'java', 'c', 'node.js' ], visit: '1200' }, { _key: 'blog:1', _score: 3899, id: '1', user: 'fire', keys: [ 'c', 'java', 'js' ], visit: '3899' } ] 

    保存索引

    多条件联连查询是通过索引并集实现的,可通过 index 参数只输出索引,然后通过 OnceDB 的 zrangehmget 指令来提取数据,而不必每次都重新进行计算,这样能提高在海量数量下的性能:

    比如,上文的例子通过 { index: 'blog_union' }) 保存在 blog_union 索引中:

    var indexName = await select('blog', [ [{ user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] }] , [{ user: 'like', keys: 'java' }, { sort: 'visit' }] ], { index: 'blog_union' }) 

    打印索引内容:

    var lines = await zrange(indexName, 0, -1) console.log(lines) 

    输出:

    [ '2', '3', '1' ] 

    使用 zrangehmget 指令,从索引中输出对应的 hash 数据:

    首先 promise 化 zrangehmget 接口:

    const zrangehmget = util.promisify(oncedb.client.zrangehmget).bind(oncedb.client) 

    查询从 1 到 1 的第 2 条数据(从零开始)

    var rows = await zrangehmget('blog_union', 1, 1, 'blog: user keys visit') console.log(rows) 

    输出结果:

    [ { _key: 'blog:3', _score: 1200, user: 'like', keys: 'java,c,node.js', visit: '1200' } ] 

    参考资料:

    zrangehmget 指令使用可参考 搜索、查询、计算、求和指令

    Node.JS 客户端文档 OnceDB 客户端使用帮助

    原文地址: http://onceoa.com/ask/view/k7o21fq9guwe

    1 条回复    2020-03-13 09:10:07 +08:00
    longway
        1
    longway  
       2020 年 3 月 13 日
    支持一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2798 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 13:21 PVG 21:21 LAX 06:21 JFK 09:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86