同义词支持
有关 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>”并返回组合结果。此技术可确保返回给定术语的所有同义词。
处理并发
由于索引是在单独的线程中执行的,因此在索引期间,同义词映射可能会更改,这反过来又可能导致在索引或搜索期间数据损坏或崩溃。为了解决此问题,将创建一个只读副本以进行索引。只读副本使用引用计数进行维护。
只要同义词 map 不更改,原始同义词 map 就会保留对其只读副本的引用,因此它不会被释放。同义词映射内的数据发生更改后,同义词映射会递减其只读副本的引用计数。这可确保在使用只读副本完成所有索引器时,它将自动释放。这可确保下次索引器请求只读副本时,同义词 map 将创建一个新副本(包含新数据)并返回它。
例
# 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"