搜尋

首頁  >  問答  >  主體

query - 怎麼基於Redis實作模糊查詢

問題如題,注意不是指模糊查詢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

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

某草草某草草2813 天前1309

全部回覆(3)我來回復

  • 淡淡烟草味

    淡淡烟草味2017-04-24 16:02:35

    有一種變通的方法,一定程度上可以實現簡單、小數據量的模糊查詢:
    寫入用戶資訊時,將用戶名分拆作為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先天不適合做這件事,所以有別的方案,還是建議用別的方案來實現。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-24 16:02:35

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

    回覆
    0
  • 黄舟

    黄舟2017-04-24 16:02:35

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

    回覆
    0
  • 取消回覆