同义词支持¶
概述¶
RediSearch支持同义词 - 正在搜索同义词数据结构定义的同义词。
同义词数据结构是一组组,每个组包含同义词术语。例如,以下同义词数据结构包含三个组,每个组包含三个同义词术语:
{男孩,孩子,宝贝} {女孩,孩子,宝贝} {男人,人,成人}
当这三个组位于同义词数据结构内时,可以搜索“孩子”并接收文档包含“男孩”,“女孩”,“孩子”和“宝贝”。
同义词搜索技术¶
我们在术语和组ID之间使用简单的HashMap映射到映射。在构建索引期间,我们检查当前术语是否出现在同义词映射中,以及我们是否使用该术语所属的所有组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)“世界”