但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