RediSearch 是一个 Redis 模块,为 Redis 提供查询、二级索引和全文搜索功能。
要使用 RediSearch 的功能,我们需要要先声明一个 index(类似于 Elasticsearch 的索引)。然后就可以使用 RediSearch 的查询语言来查询该索引下的数据。
RediSearch 内部使用压缩的倒排索引,所以可以已较低的内存占用来实现索引的快速构建。
目前 RediSearch 最新版支持的查询功能也比较丰富了,除了基本的文本分词还支持聚合统计、停用词、同义词、拼写检查、结果排序、标签查询、向量相似度查询以及中文分词等。
RedisSearch 的一些核心概念
- 索引(Index):RedisSearch 中的索引类似于数据库中的表,它是存储实际文档数据的地方。每个索引都包含了一个或多个字段,可以在其中创建全文搜索索引。
- 文档(Document):文档是指要进行全文搜索的实际数据,它们存储在 RedisSearch 索引中。每个文档都包含了一个或多个字段,可以根据这些字段进行搜索。
- 字段(Field):字段是文档中的一个属性或者数据项,例如标题、内容、作者等。在 RedisSearch 中,可以为每个字段创建全文搜索索引,以便进行搜索。
- 分词(Tokenization):分词是指将文本数据拆分成一个个独立的词语或者标记的过程。在全文搜索中,分词是非常重要的,它决定了搜索引擎如何理解和处理查询语句。
- 倒排索引(Inverted Index):倒排索引是全文搜索引擎中常用的一种数据结构,它将每个词语映射到包含该词语的文档列表,这样就可以快速地根据词语进行搜索。
- 分数(Score):在搜索结果中,每个文档都会被分配一个分数,用来表示与查询的相关性。分数越高的文档越与查询匹配。
- 过滤器(Filter):过滤器用于对搜索结果进行筛选,可以根据文档的某些属性或者字段值进行过滤,例如时间范围、地理位置等。
- 聚合(Aggregation):聚合操作用于对搜索结果进行统计和汇总,可以计算文档数量、平均分数、最大最小值等。
创建索引
执行 RedisSearch 提供的命令来创建索引。创建索引的命令是 FT.CREATE,其基本语法如下:
FT.CREATE index_name ON hash_prefix SCHEMA field1 type1 [field2 type2 ...]
- index_name 是要创建的索引名称。
- hash_prefix 是用于存储索引数据的 Redis 哈希键的前缀。这决定了索引数据存储在哪个 Redis 键空间中。
- field1 type1, field2 type2 是索引的字段名和对应的数据类型。目前支持的数据类型包括 TEXT、NUMERIC、TAG(用于存储标签)等。
例如,创建一个名为 my_index 的索引,用于存储文章的标题和内容,可以执行以下命令:
FT.CREATE my_index ON hash_prefix SCHEMA title TEXT content TEX
添加文档
一旦索引创建完成,你就可以向索引中添加文档了。使用 FT.ADD 命令来添加文档到索引中。基本语法如下:
FT.ADD index_name document_id score field1 value1 [field2 value2 ...]
- index_name 是要添加文档的索引名称。
- document_id 是文档的唯一标识符。
- score 是文档的相关性分数。
- field1 value1, field2 value2 是文档的字段名和对应的值。
例如,向 my_index 索引中添加一篇标题为 "Hello World",内容为 "Redis is awesome" 的文档,可以执行以下命令:
FT.ADD my_index doc1 1.0 FIELDS title "Hello World" content "Redis is awesome"
执行搜索
使用 FT.SEARCH 命令,参数是索引名称和需要搜索的关键词:
FT.SEARCH my_index "world"
- 搜索特定字段
可以选择要搜索的字段,比如 title:
ft.search my_index "@title:world"
- 按列表中的任何单词搜索
类似于逻辑 OR 操作,比如要查找与 hello 或 goodbye 匹配的所有文档:
ft.search my_index "hello|goodbye"
- 搜索结果分页
和 SQL 是一样的,使用 LIMIT 关键词,比如:
ft.search my_index "world" LIMIT 10, 5
- 反向搜索
在搜索关键词前使用 - 来排除结果中包含该字段的信息:
ft.search my_index "-foo"
- 部分搜索
还可以使用 * 只搜索单词的一部分,比如要查找以 good 开头的单词的所有文档:
ft.search my_index "good*"
需要注意的是,这样做仅限于前缀,比如关键词是这样的话 *good,是不支持的。
- 模糊匹配
这个功能很强大,它是一种近似的搜索手段,使用 %。
假设你把想要查找的单词写错了,把 world 写成了 wold,它依然能查出来,比如:
ft.search my_index "%wold%"
总结
在使用 RedisSearch 进行全文搜索时,可以根据实际需求进行索引的创建和优化,以及搜索查询的执行和结果处理。可以根据文档中的字段、文档的相关性、分页等因素进行搜索查询的调整和过滤。