使用方式
向量数据库支持对数据库表中文本列属性建立索引并进行基于BM25算法族的相似性排名的检索召回,索引列属性支持范围包括文本TEXT类型和文本数组TEXT[]类型;索引中文本数组类型数据中数组的每一个元素都会作为一个单词进行BM25算法的词倒排建模,而文本数据会由数据库内置的bm25_tokenize函数进行自动文本分词成单词的文本数组后建立词倒排模型,目前只保证中英文文本的分词有效性。
本小节介绍向量数据库中文本索引的基本功能,包括创建表、创建文本索引、使用索引进行相似文档召回、查询索引信息等操作。
如要使用外部分词器,请使用TEXT[]属性列创建文本索引,并导入经过外部分词得到的文本数组数据。
- 创建包含需要做相似文本检索的TEXT[]属性列的数据表。
gaussdb=# CREATE TABLE st_information (st_id SERIAL PRIMARY KEY, st_name TEXT[], st_email TEXT[]); - 在数据表中插入数据。
gaussdb=# INSERT INTO st_information(st_name, st_email) VALUES ('{"Joe", "Root"}', '{"joe@xyz.com", "ceo@xyz.com", "common-domain@xyz.com"}'), ('{"Tim", "David"}', '{"tim@xyz.com", "tim2@xyz.com", "joe@xyz.com", "common-domain@xyz.com"}'), ('{"Random", "Dude"}', '{"ceo@xyz.com", "tim2@xyz.com", "joe@xyz.com", "common-domain@xyz.com", "repeated@xyz.com"}'), ('{"Why", "You"}', '{"ceo@xyz.com", "tim2@xyz.com", "joe@xyz.com", "common-domain@xyz.com", "repeated@xyz.com", "repeated@xyz.com", "repeated@xyz.com"}'), ('{"Some", "Really", "Long", "Name"}', '{"some-really-long-email-of-the-user@xyz.com", "common-domain@xyz.com"}'), ('{"Boring", "Boris"}', '{"common-domain@xyz.com"}'); - 构建文本全文检索索引,设置构建并发度为16。
gaussdb=# CREATE INDEX st_information_st_email_bm25_index ON st_information USING BM25(st_email) WITH (num_parallels=16); - 使用索引按关键字"common-domain@xyz.com"检索bm25分数最高的文档。
-- 设置检索算法 gaussdb=# SET bm25_ranking_metric = 0; -- 进行检索 gaussdb=# SELECT /*+ indexscan(st_information st_information_st_email_bm25_index) */ * FROM st_information ORDER BY st_email ### '{common-domain@xyz.com}' DESC LIMIT 1;
通过bm25_ranking_metric设置BM25算法族文档相似评分算法,支持的评分方式如下:
- 0:BM25_OKAPI (默认值)
- 1:BM25_ATIRE
- 2:BM25_L
- 3:BM25_PLUS
- 4:TF_IDF
- 通过视图查询当前索引的页面占用信息、统计信息。
gaussdb=# SELECT * FROM gs_bm25_inspect('st_information_st_email_bm25_index');
如要使用内置分词器,请使用TEXT属性列创建文本索引,文本数据会在索引内部自动调用gs_bm25_tokenize函数进行分词。
- 创建包含TEXT属性列的数据表。
gaussdb=# CREATE TABLE bm25_test (id INT, text TEXT); - 在数据表中插入数据,text列插入文本数据。
gaussdb=# INSERT INTO bm25_test VALUES (1, '向量数据库'), (2, 'bm25索引'), (3, 'gsivfflat索引'), (4, 'gsdiskann索引'), (5, '向量标量混合索引'); - 构建BM25索引。
gaussdb=# CREATE INDEX bm25_test_text_idx ON bm25_test USING BM25(text); - 使用BM25索引检索最相关的两篇文档。
gaussdb=# SELECT /*+ indexscan(bm25_test bm25_test_text_idx) */ *, text ### '向量数据库' AS score FROM bm25_test ORDER BY score DESC LIMIT 2;