换掉ES? Redis官方搜索引擎,效率大幅提升
RediSearch是一个Redis模块,为Redis提供查询、二次索引和全文搜索。要使用RediSearch,首先要在Redis数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。 RedSearch使用压缩的反向索引进行快速索引,占用内存少。RedSearch索引通过提供精确的短语匹配、模糊搜索和数字过滤等功能增强了
RedSearch使用压缩的反向索引进行快速索引,占用内存少。RedSearch索引通过提供精确的短语匹配、模糊搜索和数字过滤等功能增强了
实现特性
基于文档的多个字段全文索引
高性能增量索引
文档排序(由用户在索引时手动提供)
在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询
可选的查询子句
基于前缀的搜索
支持字段权重设置
自动完成建议(带有模糊前缀建议)
精确的短语搜索
在许多语言中基于词干分析的查询扩展
支持用于查询扩展和评分的自定义函数
将搜索限制到特定的文档字段
数字过滤器和范围
使用 Redis 自己的地理命令进行地理过滤
Unicode 支持(需要 UTF-8 字符集)
检索完整的文档内容或只是ID 的检索
支持文档删除和更新与索引垃圾收集
支持部分更新和条件文档更新
对比 Elasticsearch
索引构建测试
查询性能测试
安装
git clone https://github.com/RediSearch/RediSearch.gitcd RediSearch # 进入模块目录make setupmake install
note: RediSearch的安装比较复杂原包无法进行编译操作所以我们使用docker安装docker run -p 6379:6379 redislabs/redisearch:latest
module list
1) 1) "name"
2) "ReJSON"
3) "ver"
4) "20007"
2) 1) "name"
2) "search"
3) "ver"
4) "20209"
返回数组存在“ft”或 “search”(不同版本),表明 RediSearch 模块已经成功加载。
命令行操作
xxx.xxx.xxx.xxx:0>ft.create "student" schema "name" text weight 5.0 "sex" text "desc" text "class" tag"OK"
type student"none"
我们创建的索引redis是不认识的,这证明使用的是插件。
ft.add student 001 1.0 language "chinese" fields name "张三" sex "男" desc "这是一个学生" class "一班""OK"
xxx.xxx.xxx.xxx:0>FT.SEARCH student * SORTBY sex desc RETURN 3 name sex desc
1) "2"
2) "001"
3) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
4) "002"
5) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
xxx.xxx.xxx.xxx:0>ft.search student "张三" limit 0 10 RETURN 3 name sex desc
1) "2"
2) "001"
3) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
4) "002"
5) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
ft.search student "李*" SORTBY sex desc RETURN 3 name sex desc1) "1"2) "003"3) 1) "name" 2) "李四" 3) "sex" 4) "男" 5) "desc" 6) "这是一个学生"
xxx.xxx.xxx.xxx:0>FT.SEARCH beers "%%张店%%"1) "1"2) "beer:1"3) 1) "name" 2) "集团本部已发布【文明就餐公约】,2号楼办公人员午餐的就餐时间是11:45~13:00,现经行政服务部进行抽查,发现我们部门有员工违规就餐现象。请大家务必遵守,相互转告,对于外地回到集团办公的同事,亦请遵守,谢谢!" 3) "org" 4) "山东省淄博市张店区" 5) "school" 6) "山东理工大学"
FT.CREATE idx SCHEMA txt TEXTFT.ADD idx docCn 1.0 LANGUAGE chinese FIELDS txt
FT.CREATE idx SCHEMA txt TEXTFT.ADD idx docCn 1.0 LANGUAGE chinese FIELDS txt "Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。[8]"FT.SEARCH idx "数据" LANGUAGE chinese HIGHLIGHT SUMMARIZE# Outputs:# 数据?... 数据进行写操作。由于完全实现了发布... 数据冗余很有帮助。[8...
xxx.xxx.xxx.xxx:0>FT.SEARCH idx "数*" LANGUAGE chinese HIGHLIGHT1) "1"2) "docCn"3) 1) "txt" 2) "Redis支持主从同步。<b>数据b>可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对<b>数据b>进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和<b>数据b>冗余很有帮助。[8]"
xxx.xxx.xxx.xxx:0>FT.SEARCH idx "%%单的树%%" LANGUAGE chinese HIGHLIGHT1) "1"2) "docCn"3) 1) "txt" 2) "Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。[8]"
ft.search student *
1) "2"
2) "doudou"
3) 1) "name"
2) "豆豆"
3) "jtzz"
4) "“检索”是很多产品中"
5) "phone"
6) "18563717107"
4) "ttao"
5) 1) "name"
2) "姚元涛"
3) "jtzz"
4) "一个生病的人只"
5) "phone"
6) "18563717107"
ft.search student '@phone:185* @name:豆豆'
1) "1"
2) "doudou"
3) 1) "name"
2) "豆豆"
3) "jtzz"
4) "“检索”是很多产品中"
5) "phone"
6) "18563717107"
xxx.xxx.xxx.xxx:0>ft.del student 002"1"
xxx.xxx.xxx.xxx:0>ft.drop student"OK"
xxx.xxx.xxx.xxx:0>FT._LIST1) "student1"2) "ttao"3) "idx"4) "student"5) "myidx"6) "123"7) "myIndex"8) "testung"9) "student2"
xxx.xxx.xxx.xxx:0>ft.get student 0011) "name"2) "张三"3) "sex"4) "男"5) "desc"6) "这是一个学生"7) "class"8) "一班"
xxx.xxx.xxx.xxx:0>ft.mget student 001 002
1) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
7) "class"
8) "一班"
2) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
7) "class"
8) "一班"
123.232.112.84:0>FT.ALIASADD xs student"OK"
123.232.112.84:0>FT.ALIASDEL xs "OK"