searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享

RediSearch 全文检索

2024-04-30 02:34:46
30
0

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 进行全文搜索时,可以根据实际需求进行索引的创建和优化,以及搜索查询的执行和结果处理。可以根据文档中的字段、文档的相关性、分页等因素进行搜索查询的调整和过滤。

 

0条评论
作者已关闭评论
陈****锐
3文章数
0粉丝数
陈****锐
3 文章 | 0 粉丝
陈****锐
3文章数
0粉丝数
陈****锐
3 文章 | 0 粉丝

RediSearch 全文检索

2024-04-30 02:34:46
30
0

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 进行全文搜索时,可以根据实际需求进行索引的创建和优化,以及搜索查询的执行和结果处理。可以根据文档中的字段、文档的相关性、分页等因素进行搜索查询的调整和过滤。

 

文章来自个人专栏
1_redis
3 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0