【redis 新功能】RediSearch+RedisJSON组合做中文搜索
最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!当增加写入比率时,RedisJSON还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch会降低它可以处理的整体吞吐量。使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;
Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!那么我们不禁想问,redisSearch+redisjson 这两东西 组合在一起能干什么事情呢?嘿,那不就是可以用来做搜索么?
首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:
- RediSearch:一个功能齐全的搜索引擎;
- RedisJSON:对JSON类型的原生支持;
- RedisTimeSeries:时序数据库支持;
- RedisGraph:图数据库支持;
- RedisBloom:概率性数据的原生支持;
- RedisGears:可编程的数据处理;
- RedisAI:机器学习的实时模型管理和部署。
安装:首先我们需要安装带所有RedisMod的Redis,这里我们使用docker安装。
拉镜像
docker pull redislabs/redismod:preview
运行:
docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview
首先我们来介绍下 RedisJSON,RedisJson 是什么?比ES快 500 倍?
近期官网给出了RedisJson(RedisSearch)的性能测试报告,可谓碾压其他NoSQL,下面是核心的报告内容,先上结论:
- 对于隔离写入(isolated writes),RedisJSON 比 MongoDB 快 5.4 倍,比 ElasticSearch 快
200 倍以上。 - 对于隔离读取(isolated reads),RedisJSON 比 MongoDB 快 12.7 倍,比 ElasticSearch 快
500 倍以上。
在混合工作负载场景中,实时更新不会影响 RedisJSON 的搜索和读取性能,而 ElasticSearch 会受到影响。以下是具体的数据:
- RedisJSON* 支持的操作数/秒比 MongoDB 高约 50 倍,比 ElasticSearch 高 7 倍/秒。
- RedisJSON* 的延迟比 MongoDB 低约 90 倍,比 ElasticSearch 低 23.7 倍。
此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearch 和 MongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch 会降低它可以处理的整体吞吐量。
结合延迟和吞吐量改进,RedisJSON* 比 Mongodb 快 5.4 倍,比 ElasticSearch 快 200 倍以上,用于隔离写入。
插入json数据进去
JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"红米5A","subTitle":"全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 红色特别版 移动联通电信4G手机","brandName":"苹果","price":5499,"count":10}'
接下来可以通过JSON.GET命令获取JSON类型键值对的值;
JSON.GET product:1
也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;
如获取name 和suTitle 两个属性
JSON.GET product:1 .name .subTitle
RediSearch
通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!
使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;
FT.CREATE {index}
[ON {data_type}]
[PREFIX {count} {prefix} [{prefix} ..]
[LANGUAGE {default_lang}]
SCHEMA {identifier} [AS {attribute}]
[TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
[SORTABLE] [NOINDEX]] ...
使用 FT.CREATE 命令可以建立索引,语法中的参数意义如下;
index:索引名称;
data_type:建立索引的数据类型,目前支持JSON或者HASH两种;
PREFIX:通过它可以选择需要建立索引的数据前缀,比如 PREFIX 1 “product:” 表示为键中以 product: 为前缀的数据建立索引;
LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;
identifier:指定属性名称;
attribute:指定属性别名;
TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;
SORTABLE:指定属性可以进行排序。
看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;
FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG
更多推荐
所有评论(0)