首页 >

但redis不支持sql查询 – 数据库 – 前端|

一台电脑怎么装路由器,怎么将音乐一直播放视频,360随身wifi掉线怎么办但redis不支持sql查询 - 数据库 - 前端|但redis不支持sql查询

OnceDB是基于Redis实现的全文搜索数据库,可以像SQL数据库那样创建辅助索引,提高条件搜索的性能。

OnceDB并不改变Redis的数据存储结构,Redis数据库文件可以直接在OnceDB中操作,然后再返回Redis中使用。

# 索引搜索## 搜索原理

全文搜索的性能比较差,可通过创建索引的办法提高性能,办法是为索引字段创建一个有序列表,然后在条件查询时,对这些有序列表做交集查询操作。

# 创建4条 Hash 数据

hmset article:001 poster dota visit 21 key jshmset article:002 poster dota visit 11 key chmset article:003 poster like visit 34 key jshmset article:004 poster like visit 44 key c

然后大家为上面的字段创建索引,权重分数设为: 202000201,一个关于时间的整数,值为article的ID值

# 维护索引

zadd *article.poster:dota 20200201 001 20200201 002zadd *article.poster:like 20200201 003 20200201 004zadd *article.key:js 20200201 001 20200201 003zadd *article.key:c 20200201 002 20200201 004

# visit 的索引直接使用其值为权重分数

zadd *article.visit 21 001 11 002 34 003 44 004

“`

## 按索引查询

求 *article.key:js 和 *article.poster:dota 两个索引的交集,并存放在 *tmp1 有序列表中:

“`

zinterstore *tmp1 2 *article.key:js *article.poster:dota> 1

“`

然后 *tmp1 存放的就是 满足 key = js 和 poster = dota 条件的 ID集合:

“`

zrange *tmp1 0 -1> 001

“`

可使用zrangehmget指令打印相应的HASH值:

“`

zrangehmget *tmp1 0 -1 article: key poster1) 0012) 404004023) js4) dota5) 6)

“`

其结果与直接全文搜索 key = js 和 poster = dota 的搜索结果相同

“`

hsearch article:* key = js poster = dota1) article:0012) js3) dota

“`

## 搜索范围

比如要搜索 visit 数量在 20 到 30 之间,key = js 的数据,可通过控制权重的方法实现

创建临时索引,只取 *article.visit 的权重 和 key = js 的数据

“`

zinterstore *tmp2 2 *article.key:js *article.visit weights 0 1> 2

“`

取 20 ~ 30 之间的数据

“`

zrangebyscore *tmp2 20 30> 001

“`

可使用 zrangehmgetbyscore 打印出对应的hash数据:

“`

zrangehmgetbyscore *tmp2 20 30 article: key visit1) 0012) 213) js4) 215) 6)

“`

其结果与使用全文搜索的结果一致:

“`

hsearch article:* visit >= 20 visit <= 30 key = js1) article:0012) 213) 4) js

“`

因为里面有两个相同的字段,visit >= 20 visit <= 30,搜索结果只会输出一个,第3行重复的字段会输出空。

OnceDB更多扩展指令可查看: [OnceDB 搜索、查询、计算、求和指令

https://oncedb.com/wiki/view/oncedb-server.zh-CN/data_instruction

# 自动索引

Redis索引的创建和维护并不十分方便,OnceDB 在数据修改时可选择自动创建辅助索引。

## 创建索引:upsert schema field operator value …

使用 upsert/insert/update 指令和特殊的操作符可自动创建索引:

如上文的例子可写成:

“`

upsert article id @ 001 poster ? dota visit / 21 key ? jsupsert article id @ 002 poster ? dota visit / 11 key ? cupsert article id @ 003 poster ? like visit / 34 key ? jsupsert article id @ 004 poster ? like visit / 44 key ? c

“`

操作符:

> @ : 主键

> ? : 分组索引

> / : 排序索引

操作后会自动创建: *article *article.poster:dota *article.poster:like *article.visit *article.key:js *article.key:c 等索引。

## 多条件索引查询:find schema from to field operator value …

含有索引的字段,可使用 find 命令通过索引字段查询出来,比如查询:key = js 和 poster = dota 的数据,可通过 “?” 指明这两个字段是分组索引:

“`

find article 0 -1 key ? js poster ? dota1) 12) article:0013) js4) dota

“`

1: 代表符合条件的数据总数,如果是 -1 则代表使用了全文搜索,性能较差。

## 索引范围查询

可添加 @ 指定索引范围,并使用 + 指定使用哪个索引字段的分数权重范围。

“`

find article 0@20 -1@30 key ? js visit /+ *1) 12) article:0013) js4) 21

“`

## 删除自动索引

OnceDB不存储索引定义,删除时需要手动指出哪些字段含有索引,需要指定字段名和索引操作符即可。

“`

remove article @ 001 key ? poster ? visit /

“`

还可以自定义索引名称,权重分数,更多说明可查看:

OnceDB数据修改和查询帮助文档

https://oncedb.com/wiki/view/oncedb-server.zh-CN/data_modify_and_query


但redis不支持sql查询 - 数据库 - 前端|
  • access字段属性的设置 - 数据库 - 前端|
  • access字段属性的设置 - 数据库 - 前端| | access字段属性的设置 - 数据库 - 前端| ...

    但redis不支持sql查询 - 数据库 - 前端|
  • vlookup函数对查找值字段有限制么 - 数据库 - 前端|
  • vlookup函数对查找值字段有限制么 - 数据库 - 前端| | vlookup函数对查找值字段有限制么 - 数据库 - 前端| ...

    但redis不支持sql查询 - 数据库 - 前端|
  • 比亚迪元ev360怎么样 - 数据库 - 前端|
  • 比亚迪元ev360怎么样 - 数据库 - 前端| | 比亚迪元ev360怎么样 - 数据库 - 前端| ...