全文搜索是信息检索中使用的一种技术,它允许根据文档全部文本中是否存在关键字或短语来搜索文档或数据。与依赖简单关键字匹配的传统搜索方法不同,全文搜索会考虑上下文、同义词和词语邻近度,以提供更相关的搜索结果。
全文搜索引擎使用算法对文档或数据源的内容进行索引,并允许用户使用自然语言查询或布尔运算符查询索引以过滤和细化结果。全文搜索常用于数据库、搜索引擎、内容管理系统以及其他需要对大量基于文本的数据进行高效准确搜索的应用中。
在模块出现之前,全文搜索是使用原生 Redis 命令实现的。 RediSearch 模块提供了比这种模式更高的性能。然而,在某些环境中,RediSearch 可能不可用。此外,这种模式也非常有趣,可以推广到 RediSearch 可能不是理想选择的其他工作负载。
假设你想搜索一些文本文档——这对于 Redis 来说可能不是一个显而易见的用例,因为它通过键而不是表进行访问。但恰恰相反,Redis 可以用来支撑一个非常新颖的全文搜索引擎。
首先,让我们看一些例子
简单起见,我们仅通过空格将这些项分解为单词集合
> SADD ex1 redis is very fast > SADD ex2 cheetahs are very fast > SADD ex3 cheetahs have spots
请注意,我们给每一行都有一个自己的集合 (ex1...),然后根据每个单词向该集合添加多个成员(尽管看起来我们只是添加了整行,但 SADD 是可变参数的,因此接受多个成员)。我们还将所有单词都转换为小写。
接下来我们需要反转这个索引,以显示哪个单词位于哪个文档中。为此,我们将为每个单词创建一个集合,然后将文档集合名称作为成员放入其中。
> SADD redis ex1 > SADD is ex1 > SADD very ex1 ex2 > SADD fast ex1 ex2 > SADD cheetahs ex2 ex3 > SADD have ex3 > SADD spots ex3
为清晰起见,我们将其分解为单独的命令,但所有命令通常都会使用 MULTI/EXEC 块以原子方式执行。
要查询我们这个微型全文搜索索引,我们将使用 SINTER 命令(集合交集)。 要查找包含“very”和“fast”的文档
> SINTER very fast 1) "ex2" 2) "ex1"
如果没有文档与查询匹配,我们将得到一个空结果
> SINTER cheetahs redis (empty list or set)
如果你想进行逻辑或搜索,可以将 SINTER 替换为 SUNION (集合并集)。
> SUNION cheetahs redis 1) "ex2" 2) "ex3" 3) "ex1"
从索引中删除一个项目稍微复杂一些。首先,我们将从文档集合中获取文档索引成员(SMEMBERS),然后从单词索引中删除文档 ID。
> SMEMBERS ex3 1) "have" 2) "cheetahs" 3) "spots" > SREM have ex3 > SREM cheetahs ex3 > SREM spots ex3
这不能在 Redis 的单个操作中完成,因此你需要先获取 SMEMBERS 的结果,然后执行 SREM 命令。
当然,这只是一个非常简单的全文搜索。你可以使用有序集合命令而不是集合命令来创建更具反映性的索引。这样,例如,如果一个文档中某个单词出现不止一次,你可以让它比只出现一次的文档“排名”更高。上面的模式基本保持不变,只是使用了有序集合命令。