跳到内容

同义词支持

概述

RediSearch支持同义词 - 正在搜索同义词数据结构定义的同义词。

同义词数据结构是一组组,每个组包含同义词术语。例如,以下同义词数据结构包含三个组,每个组包含三个同义词术语:

{男孩,孩子,宝贝} {女孩,孩子,宝贝} {男人,人,成人}

当这三个组位于同义词数据结构内时,可以搜索“孩子”并接收文档包含“男孩”,“女孩”,“孩子”和“宝贝”。

同义词搜索技术

我们在术语和组ID之间使用简单的HashMap映射到映射。在构建索引期间,我们检查当前术语是否出现在同义词映射中,以及我们是否使用该术语所属的所有组ID。

对于每个组ID,我们将另一个记录添加到名为“\〜\ ”的反转索引,其包含与术语本身相同的信息。执行搜索时,我们检查搜索的术语是否在同义词映射中出现,如果我们拍摄所有组ID,则术语属于。对于每个组ID,我们搜索“\〜\ ”并返回组合结果。此技术确保我们返回给定术语的所有同义词。

处理并发

由于索引在单独的线程中执行,因此同义词映射可能在索引期间改变,这又可以在索引/搜索期间导致数据损坏或崩溃。要解决此问题,我们创建了一个用于索引目的的只读副本。使用Ref Count维护只读副本。

只要同义词映射不会改变,原始同义词映射会占据其只读副本的引用,以便它不会被释放。一旦同义词地图中的数据发生了变化,同义词映射会缩小其只读副本的参考计数。这可确保使用只使用读取副本完成所有索引器时,只能自动释放只读副本。此外,它确保下次索引器询问只读副本,同义词映射将创建一个新副本(包含新数据)并返回它。

快速例子

#创建索引> ft.create idx schema t text#创建一个同义词组> ft.synupdate idx group1 hello world#插入文档> hset foo t hello(整数)1> hset bar t world(整数)1#搜索> ft.Search IDX Hello 1)(整数)2 2)“foo”3)1)“t”2)“您好”4)“栏”5)1)“T”2)“世界”
Baidu