Redis也能做搜索引擎?

Created
Aug 4, 2022 07:53 AM
Tags
redis
notion image
这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

特性

RediSearch 主要特性如下:
  • 基于文档的多个字段全文索引
  • 高性能增量索引
  • 文档排序(由用户在索引时手动提供)
  • 自动完成建议(带有模糊前缀建议)
  • 精确的短语搜索
  • 在许多语言中基于词干分析的查询扩展
  • 支持用于查询扩展和评分的自定义函数
  • 将搜索限制到特定的文档字段
  • 数字过滤器和范围
  • 在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询
  • 可选的查询子句
  • 基于前缀的搜索
  • 支持字段权重设置
  • 使用 Redis 自己的地理命令进行地理过滤
  • Unicode 支持(需要 UTF-8 字符集)
  • 检索完整的文档内容或只是 ID 的检索
  • 支持部分更新和条件文档更新
  • 支持文档删除和更新与索引垃圾收集

性能

ElasticSearch在同等硬件环境下进行性能评测对比,对维基百科560万个文档(约 5.3GB)进行索引,并对索引的数据集做双单词搜索。对比图如下:

生成索引耗时:

notion image

搜索性能对比:

notion image

安装

通过docker快速部署

docker run -p 6379:6379 redislabs/redisearch:latest

使用

使用 redis-cli 来对 RediSearch 进行相关的操作。

创建索引和字段

127.0.0.1:6379> ft.create myidx schema title text weight 5.0 desc text OK
其中“myidx”为索引的名称,此索引包含了两个字段“title”和“desc”,“weight”为权重,默认值为 1.0。

将内容添加到索引

127.0.0.1:6379> ft.add myidx doc1 1.0 fields title "He urged her to study English" desc "good idea" OK
其中“doc1”为文档 ID(docid),“1.0”为评分(score)。

根据关键查询

127.0.0.1:6379> ft.search myidx "english" limit 0 10 1) (integer) 1 2) "doc1" 3) 1) "title" 2) "He urged her to study English" 3) "desc" 4) "good idea"
可以看出我们使用 title 字段中的关键字“english”查询出了一条满足查询条件的数据。

中文搜索

首先我们需要先给索引中,添加一条中文数据,执行命令如下:
127.0.0.1:6379> ft.add myidx doc2 1.0 language "chinese" fields title "Java 14 发布了!新功能速览" desc "Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8" OK
注意:这里必须要设置语言编码为中文,也就是“language "chinese"” ,默认是英文编码,如果不设置则无法支持中文查询(无法查出结果)。

删除索引的数据

127.0.0.1:6379> ft.del myidx doc1 (integer) 1
我们使用索引加文档 ID 就可以实现删除数据的功能。

删除索引

我们可以使用“ft.drop”关键字删除整个索引,执行命令如下:
127.0.0.1:6379> ft.drop myidx OK

客户端库支持

支持大部分语言,详见clients library