Redisearch實(shí)現(xiàn)的全文檢索功能服務(wù)
“檢索”是很多產(chǎn)品中無(wú)法繞開的一個(gè)功能模塊,當(dāng)數(shù)據(jù)量小的時(shí)候可以使用模糊查詢等操作湊合一下,但是當(dāng)面臨海量數(shù)據(jù)和高并發(fā)的時(shí)候,業(yè)界常用 elasticsearch 和 lucene 等方案,但是elasticsearch對(duì)運(yùn)行時(shí)內(nèi)存有著最低限額,其運(yùn)行時(shí)大小推薦 2G 以上的內(nèi)存空間,并且需要額外的磁盤空間做持久化存儲(chǔ)。
其實(shí)mongoDB 內(nèi)置的正則匹配搜索文本以及自帶的 text 索引和 search 關(guān)鍵字也是一套靠譜的解決方案,但是這一次我們帶來(lái)一種更加高效經(jīng)濟(jì)的文本檢索方案:Redisearch
Redis Modules 是 redis 4.0 引入的一種擴(kuò)展機(jī)制,用戶可以通過(guò)實(shí)現(xiàn) redis module 提供的 C api 接口為 redis 服務(wù)添加定制化功能。 redisLab 也希望籍此來(lái)規(guī)范 redis 社區(qū)的 ecosystem 實(shí)現(xiàn)。
redis module 本身的版本獨(dú)立于redis,并且以編譯成動(dòng)態(tài)加載庫(kù) .so 文件的方式 release, 不同版本的 redis 可以 load 同一版本 module.so 文件。
redis 提供了兩種加載方式。可以通過(guò) 在 conf 文件中 加入 loadmodule /path/to/mymodule.so ,也可以在 redis-cli中使用命令 MODULE LOAD /path/to/panda.so 動(dòng)態(tài)加載,MODULE UNLOAD 卸載。
特性
基于文檔的全文索引。
高性能增量索引。
支持文檔評(píng)分,文檔字段(field) 權(quán)重機(jī)制。
支持布爾復(fù)雜查詢。
支持自動(dòng)補(bǔ)全。
基于 snowball 的詞干分析,多語(yǔ)言支持。使用 friso 支持中文分詞。
utf-8 字符集支持。
redis 數(shù)據(jù)持久化支持。
自定義評(píng)分機(jī)制。
其原理是在 redis 的 hashmap 基礎(chǔ)上就可以很容易實(shí)現(xiàn)倒排索引的結(jié)構(gòu)。redisearch 倒排索引除了實(shí)現(xiàn)了基礎(chǔ)功能外,還引入了內(nèi)存管理等優(yōu)化功能。如果有興趣可以閱讀源碼中的 src/inverted_index.c 部分
首先,安裝Rediseach,記住一點(diǎn)你本地的redis服務(wù)版本必須在4.0以上,網(wǎng)上一大堆編譯安裝的攻略,繁瑣又浪費(fèi)時(shí)間,所以又到了Docker登場(chǎng)時(shí)間了,hub上有編譯好的免費(fèi)鏡像供我們下載
1,安裝redis
#下載rpm源并安裝 yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #安裝redis yum --enablerepo=remi install -y redis #啟動(dòng)redis服務(wù) service redis start
2,安裝Rediseach
docker pull redislabs/redisearch
下載后,直接在后臺(tái)啟動(dòng)服務(wù)
docker run -d -p 6666:6379 redislabs/redisearch:latest

此時(shí)已經(jīng)有一個(gè)docker容器在后臺(tái)啟動(dòng)了,redis服務(wù)映射到了宿主的6666端口,我們來(lái)連接一下
redis-cli -h localhost -p 6666

檢查 modules 是否成功加載

如果返回?cái)?shù)組中存在 "ft" , 則表明 redisearch 已經(jīng)成功加載。
Redisearch 的索引概念 與elasticsearch 的 index 類似,表示某一類文檔資源單元。
這里我們定義了一個(gè) SMARTX_VM 索引,其中存儲(chǔ)的文檔 包含 了 title 和 desc 兩個(gè) 類型為 TEXT 的field。
FT.CREATE SMARTX_VM SCHEMA title TEXT WEIGHT 5.0 desc TEXT
然后向剛剛創(chuàng)建的這條索引加一個(gè)文檔
FT.ADD SMARTX_VM vm-20190901 1.0 LANGUAGE "chinese" FIELDS title "中國(guó)" desc "我是中國(guó)人"
LANGUAGE "chinese" 參數(shù) 表示 使用 中文分詞器 處理文本。默認(rèn)為英文
此時(shí)我們進(jìn)行文檔檢索
FT.SEARCH SMARTX_VM "中國(guó)" LANGUAGE "chinese"
注意檢索的時(shí)候也要指定語(yǔ)言,這里我們用中文分詞,默認(rèn)的英文分詞是無(wú)法檢索中文的

可以看到已經(jīng)返回了我們想要的結(jié)果。
Redisearch 是一個(gè)高效,功能完備的內(nèi)存存儲(chǔ)的高性能全文檢索組件, 十分適合應(yīng)用在數(shù)據(jù)量適中, 內(nèi)存和存儲(chǔ)空間有限的環(huán)境。借助數(shù)據(jù)同步手段,我們可以很方便的將redisearch 結(jié)合到現(xiàn)有的數(shù)據(jù)存儲(chǔ)中, 進(jìn)而向產(chǎn)品提供 全文檢索, 自動(dòng)補(bǔ)全等服務(wù)優(yōu)化功能。

浙公網(wǎng)安備 33010602011771號(hào)