query - 怎麼基於Redis實作模糊查詢
某草草
某草草 2017-04-24 16:00:35
0
3
1297

問題如題,注意不是指模糊查詢Key,是指對值的模糊(關鍵字)查詢。
舉個栗子:

$ HMSET user:1 name jack age 18
$ HMSET user:2 name jackson age 21
$ HMSET user:3 name suse age 16

假如有上述用戶數據,以哈希形式存儲,如果要做排序,可以

# score为#age,value为#userId,以ZSET结构存储
$ ZADD user:rank:age 18 1 21 2 16 3
# 查询有序列表
$ ZRANGE user:rank:age 0 -1

但如果需要既實現根據年齡排序,還要能夠實現關鍵字查詢(模糊匹配用戶名),應該怎樣實現?

某草草
某草草

全部回覆(3)
淡淡烟草味

有一種變通的方法,一定程度上可以實現簡單、小數據量的模糊查詢:
寫入用戶資訊時,將用戶名分拆作為Key,來記錄用戶ID

SADD user:like:j jack jackson
SADD user:like:ja jack jackson
SADD user:like:jac jack jackson
SADD user:like:jack jack jackson
SADD user:like:jacks jackson
SADD user:like:jackso jackson
SADD user:like:jackson jackson

後面模糊查詢時,輸入:j,则可以从SET集合中查出jackjackson兩項,當然,這兩項值可以用用戶ID來代替,再根據用戶ID來查詢用戶哈希資訊。
此方式僅適用於查詢條件單一、且字段長度較短場景,如果:同時模糊匹配帖子標題和帖子文章,就不行了,標題還能試試,內容肯定無法實現的。

當然Redis先天不適合做這件事,所以有別的方案,還是建議用別的方案來實現。

巴扎黑

委婉的方式是自己寫lua腳本。
或是資料集不大的情況下自己在客戶端過濾。
如果模糊查詢是硬需求,建議轉移到solr或elasticsearch來做。

黄舟

Redis 沒有那麼豐富的查詢方法, 模糊查詢也只能在 key 中進行,並不能滿足你這麼豐富的需求。如果要高速儲存建議使用 Redis, 如果是想進行業務邏輯,要有豐富的查詢方式,建議使用MongoDb

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板