全文索引是指根据文本内容,例如文本内的关键词、短语、单词前缀等文本集合进行高效检索、过滤等的技术。openGemini支持全文检索,其使用了一种称为CLV(Compressed Log with Variable Length Token)变长token的全文索引技术 [1] ,以提供较低的磁盘占用,较高的查询性能,以及丰富的查询方式。
全文索引是openGemini索引类型中的一种,是在openGemini现有索引框架下,并且采用了倒排索引(inverted index)来实现。本文主要介绍openGemini全文索引的实现原理和整体流程。了解更多原理和实现细节,请参考文末的参考文献。
全文索引构建
构建openGemini全文索引的大体流程如下图所示:
首先文本数据先经过一个标准的分词器进行基础的分词,在标准分词器中使用了如下的分隔符:", '";=()[]{}?@&<>/:\n\t\r",即文本数据在经过标准分词器时,会使用使用这些分割符将文本数据流中的数据分割成单个的单词。
例如:"GET /english/teams/teamgroup"文本,经过标准分词器后,会生成"GET","english","teams","teamgroup "等4个token。
经过标准分词之后,独立的token会按照顺序进入学习型分词器进行匹配,例如学习型分词器在匹配到"GET","english","teams"等3个单词经常出现在一起的概率很高,那么就会为这"GET","english","teams"3个单词建立一条倒排表记录。倒排表如下图示例(倒排表中docX表示不同的文本数据行):
这样原来本来需要分别针对"GET","english","teams"等3个token都需要建立的倒排表,而这三个倒排表中很多相同的部分现在只需要建立一份,节约了存储空间。
文本检索原理
全文索引检索时需要使用相同的标准分词器和学习型分词器,经过分词后,再到倒排索引中进行检索。特别值得一提的是,这里学习型分词器也是为了分词,例如写入的时候,“get english teams” 3个词是作为一个整体分词,检索的关键字若包含相同关键字,经过学习型分词器后,也会变为一个整体,这样的检索效率是更高的,结果更准确。
查询的大体流程如下图所示:
在查询的时候,例如精确查询”english”,读取倒排表时,只需要将doc1以及倒排表中的地址addr0指向的倒排表信息进行合并,合并后doc1、doc2、doc3、doc4、doc5即是我们需要查询的所有数据。
使用教程
创建索引
若要使用全文索引,需要预先创建表,创建表的目的其实是为了指定要在哪些Field字段上创建全文索引(注意,对应filed字段的类型必须是string类型)。
相关文档阅读:
docs.opengemini.org/zh/guide/sc…
当表和全文索引创建完成之后,即可对该表进行正常的数据写入。在数据写入过程,全文索引模块会在后台索引字段内容进行分词、倒排索引创建等操作。****
全文检索
openGemini数据库在全文索引创建完成并且数据导入之后,可使用openGemini提供了多种查询方式进行查询,包括精确匹配查询、短语匹配查询、模糊查询等多种功能。全文索引查询也支持与其他类型的谓词进行组合查询。
相关文档阅读:
docs.opengemini.org/zh/guide/fe…
总结
本文介绍了openGemini全文索引功能,包括基本原理,索引创建,全文查询与过滤等。与传统全文索引相比,openGemini采用的CLV动态分词算法,在倒排索引的内存资源占用、匹配效率方面都具有较大优势。
参考文献:
openGemini官网:www.openGemini.org
openGemini开源地址:github.com/openGemini
openGemini公众号:
欢迎关注~ 诚邀你加入 openGemini 社区,共建、共治、共享未来!