全文搜索是一种信息检索技术,允许根据文档的整个文本中是否存在关键字或短语来搜索文档或数据。与依赖于简单关键字匹配的传统搜索方法不同,全文搜索会考虑上下文、同义词和词语邻近性,以提供更相关的搜索结果。
全文搜索引擎使用算法索引文档或数据源的内容,并允许用户使用自然语言查询或布尔运算符查询索引,以过滤和细化结果。全文搜索通常用于数据库、搜索引擎、内容管理系统和其他需要高效准确地搜索大量基于文本数据的应用程序。
在模块出现之前,全文搜索是使用本机 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)
如果您想要逻辑或搜索,您可以用 SUNION(集合并集)替换 SINTER。
> 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 命令。
当然,这只是一个非常简单的全文搜索。您可以通过使用有序集合命令而不是集合命令来创建更具反映性的索引。例如,如果文档中某个词出现多次,您可以让它比只出现一次的文档“排名”更高。上面的模式基本上保持不变,只是使用有序集合命令。