同义词支持

有关 Redis Stack 同义词支持的详细信息

Redis Stack 支持同义词。也就是说,搜索同义词数据结构定义的同义词。

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

{boy, child, baby}
{girl, child, baby}
{man, person, adult}

当这三个组位于同义词数据结构内时,可以搜索“child”,并接收包含“boy”、“girl”、“child”和“baby”的文档。

同义词搜索技术

使用一个简单的 HashMap 来映射术语和组 ID 之间的对应关系。在索引创建期间,会检查当前术语是否出现在同义词映射中,如果出现,则获取该术语所属的所有组 ID。

对于每个组 ID,在倒排索引中添加另一条记录,称为“~<id>”,它包含与该术语本身相同的信息。在执行搜索时,会检查搜索的术语是否出现在同义词映射中,如果出现,则获取该术语所属的所有组 ID。对于每个组 ID,搜索“~<id>”,并返回组合结果。此技术确保返回给定术语的所有同义词。

处理并发性

由于索引是在单独的线程中执行的,因此同义词映射可能会在索引过程中发生变化,这反过来可能会导致索引或搜索期间的数据损坏或崩溃。为了解决这个问题,会为索引目的创建一个只读副本。只读副本使用引用计数来维护。

只要同义词映射不发生改变,原始同义词映射就会保留对只读副本的引用,因此不会被释放。在同义词映射中的数据发生改变后,同义词映射会降低其只读副本的引用计数。这确保了当所有索引器完成使用只读副本后,它将自动被释放。这确保了下次索引器请求只读副本时,同义词映射会创建一个新的副本(包含新数据)并返回它。

示例

# Create an index
> FT.CREATE idx schema t text

# Create a synonym group 
> FT.SYNUPDATE idx group1 hello world

# Insert documents
> HSET foo t hello
(integer) 1
> HSET bar t world
(integer) 1

# Search
> FT.SEARCH idx hello
1) (integer) 2
2) "foo"
3) 1) "t"
   2) "hello"
4) "bar"
5) 1) "t"
   2) "world"
RATE THIS PAGE
Back to top ↑