“檢索”是很多產品中無法繞開的一個功能模塊,當數據量小的時候可以使用模糊查詢等操作湊合一下,但是當面臨海量數據和高並發的時候,業界常用 elasticsearch 和 lucene 等方案,但是elasticsearch對運行時內存有着最低限額,其運行時大小推薦 2G 以上的內存空間,並且需要額外的磁盤空間做持久化存儲。
其實mongoDB 內置的正則匹配搜索文本以及自帶的 text 索引和 search 關鍵字也是一套靠譜的解決方案,但是這一次我們帶來一種更加高效經濟的文本檢索方案:Redisearch
Redis Modules 是 redis 4.0 引入的一種擴展機制,用戶可以通過實現 redis module 提供的 C api 接口為 redis 服務添加定制化功能。 redisLab 也希望籍此來規范 redis 社區的 ecosystem 實現。
redis module 本身的版本獨立於redis,並且以編譯成動態加載庫 .so 文件的方式 release, 不同版本的 redis 可以 load 同一版本 module.so 文件。
redis 提供了兩種加載方式。可以通過 在 conf 文件中 加入 loadmodule /path/to/mymodule.so ,也可以在 redis-cli中使用命令 MODULE LOAD /path/to/panda.so 動態加載,MODULE UNLOAD 卸載。
特性
基於文檔的全文索引。
高性能增量索引。
支持文檔評分,文檔字段(field) 權重機制。
支持布爾復雜查詢。
支持自動補全。
基於 snowball 的詞干分析,多語言支持。使用 friso 支持中文分詞。
utf-8 字符集支持。
redis 數據持久化支持。
自定義評分機制。
其原理是在 redis 的 hashmap 基礎上就可以很容易實現倒排索引的結構。redisearch 倒排索引除了實現了基礎功能外,還引入了內存管理等優化功能。如果有興趣可以閱讀源碼中的 src/inverted_index.c 部分
首先,安裝Rediseach,記住一點你本地的redis服務版本必須在4.0以上,網上一大堆編譯安裝的攻略,繁瑣又浪費時間,所以又到了Docker登場時間了,hub上有編譯好的免費鏡像供我們下載
1,安裝redis
#下載rpm源並安裝 yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #安裝redis yum --enablerepo=remi install -y redis #啟動redis服務 service redis start
2,安裝Rediseach
docker pull redislabs/redisearch
下載后,直接在后台啟動服務
docker run -d -p 6666:6379 redislabs/redisearch:latest
此時已經有一個docker容器在后台啟動了,redis服務映射到了宿主的6666端口,我們來連接一下
redis-cli -h localhost -p 6666
檢查 modules 是否成功加載
如果返回數組中存在 "ft" , 則表明 redisearch 已經成功加載。
Redisearch 的索引概念 與elasticsearch 的 index 類似,表示某一類文檔資源單元。
這里我們定義了一個 SMARTX_VM 索引,其中存儲的文檔 包含 了 title 和 desc 兩個 類型為 TEXT 的field。
FT.CREATE SMARTX_VM SCHEMA title TEXT WEIGHT 5.0 desc TEXT
然后向剛剛創建的這條索引加一個文檔
FT.ADD SMARTX_VM vm-20190901 1.0 LANGUAGE "chinese" FIELDS title "中國" desc "我是中國人"
LANGUAGE "chinese" 參數 表示 使用 中文分詞器 處理文本。默認為英文
此時我們進行文檔檢索
FT.SEARCH SMARTX_VM "中國" LANGUAGE "chinese"
注意檢索的時候也要指定語言,這里我們用中文分詞,默認的英文分詞是無法檢索中文的
可以看到已經返回了我們想要的結果。
Redisearch 是一個高效,功能完備的內存存儲的高性能全文檢索組件, 十分適合應用在數據量適中, 內存和存儲空間有限的環境。借助數據同步手段,我們可以很方便的將redisearch 結合到現有的數據存儲中, 進而向產品提供 全文檢索, 自動補全等服務優化功能。