“检索”是很多产品中⽆法绕开的⼀个功能模块,当数据量⼩的时候可以使⽤模糊查询等操作凑合⼀下,但是当⾯临海量数据和⾼并发的时候,业界常⽤ elasticsearch 和 lucene 等⽅案,但是elasticsearch对运⾏时内存有着最低限额,其运⾏时⼤⼩推荐 2G 以上的内存空间,并且需要额外的磁盘空间做持久化存储。 其实mongoDB 内置的正则匹配搜索⽂本以及⾃带的 text 索引和 search 关键字也是⼀套靠谱的解决⽅案,但是这⼀次我们带来⼀种更加⾼效经济的⽂本检索⽅案:Redisearch
Redis Modules 是 redis 4.0 引⼊的⼀种扩展机制,⽤户可以通过实现 redis module 提供的 C api 接⼝为 redis 服务添加定制化功能。redisLab 也希望籍此来规范 redis 社区的 ecosystem 实现。 sis压片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 rpms.famillecollet/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 结合到现有的数据存储中,进⽽向产品提供全⽂检索,⾃动补全等服务优化功能。