BM25全文检索索引使用指南
本章节主要介绍openGauss中BM25全文检索索引使用指南。
1. 安装部署
使用Docker实现openGauss容器化部署,简化DevOps用户的安装、配置和环境设置,参考 容器镜像安装。
2. 语法介绍
BM25全文检索索引对普通表的文档列构建全文索引,实现对文档的高效检索。
- 索引构建
BM25索引支持对指定文档列构建全文索引,支持并行构建,大幅提升大文本数据集的索引构建速度,语法如下:
``` 1. -- 设置并行构建线程数,设置范围1~32。不设置该参数时,默认单线程构建 2. ALTER TABLE {表名称} SET(parallel_workers=32);
- -- 给指定标的指定文档列构建BM25索引
- CREATE INDEX {索引名称} on {表名称} using bm25({文档列名称}); ```
BM25索引构建的相关约束见BM25索引介绍
说明:
并行构建索引场景下,计算一篇文档中词汇的Maxscore参数会和串行构建场景下存在一定偏差,小概率会影响检索过程中DAAT Maxscore方法文档剪枝策略,导致召回率有一定波动。 串行、并行构建索引召回率存在一定偏差。相同数据,多次执行并行构建,也可能存在一定偏差。 - BM25索引操作符
由于BM25索引扫描需要指定查询词,因此新增BM25索引操作符:<&>,表示根据查询词来搜索相关的文档。使用方式如下:
1. {文档列名称} <&> {查询词}
- 索引扫描
-
BM25索引扫描基本格式
BM25索引的目标是在文档数据集集中搜索出与查询词最相关的 n 篇文档,并按相关性由高到低的顺序返回给用户。其搜索语法下述固定格式:
1. -- LIMIT 不设置时返回所有与查询词相关的文档 2. select * from {表名称} ORDER BY {文档列名称} <&> {查询词} DESC LIMIT n;- 通过提示词的方式使用BM25索引扫描``` 1. -- 查询分数最高的 n 个文档 2. SELECT /+ indexscan (表名称 索引名称)/ * FROM {表名称} ORDER BY {文档列名称} <&> {查询词} DESC LIMIT n;
- -- 如果想要查看返回的文档分数,可以将分数以虚拟列的方式展示
- SELECT /+ indexscan (表名称 索引名称)/ *, {文档列名称} <&> {查询词} AS score FROM {表名称} ORDER BY {文档列名称} <&> {查询词} DESC LIMIT n; ```
- 通过扫描GUC设置使用BM25索引扫描
``` 1. -- 关闭顺序扫描 2. set enable_seqscan = off;
- -- 开启索引扫描
-
set enable_indexscan = on;
-
-- 查询分数最高的 n 个文档
- SELECT * FROM {表名称} ORDER BY {文档列名称} <&> {查询词} DESC LIMIT n;
```
说明:BM25索引扫描性能可以通过相关GUC参数调优,执行语句前可先进行参数设置,详情参考BM25参数调优。
- 索引删除
1. DROP INDEX {索引名称};
3. 示例
本节将通过实例对上述索引语法进行演示。
1. -- 创建普通表,包含id、document列,document存储文本数据
2. openGauss=# CREATE TABLE bm25_table
3. (
4. id INT,
5. document TEXT
6. );
8. CREATE TABLE
10. -- 插入文档数据
11. INSERT INTO bm25_table VALUES(1, '香蕉是热带水果');
12. INSERT INTO bm25_table VALUES(2, '小明喜欢吃香蕉');
14. -- 为document列建立bm25索引
15. openGauss=# CREATE INDEX bm25_index on bm25_table using bm25(document);
16. ALTER TABLE
18. -- 使用bm25索引检索'香蕉'相关的文档,查看查询计划,走BM25索引
19. openGauss=# EXPLAIN SELECT /*+ indexscan (bm25_table bm25_index)*/ *, document <&> '香蕉' AS score FROM bm25_table ORDER BY document <&> '香蕉' DESC;
20. QUERY PLAN
21. ---------------------------------------------------------
22. Index Scan uing bm25_index on bm25_table (cost=0.00..7.11 rows=1238 width=36)
23. Order by: (document <&> '香蕉'::text)
24. (2 rows)
26. -- 执行查询语句,检索'香蕉'相关的文档,并显示文档分数
27. openGauss=# SELECT /*+ indexscan (bm25_table bm25_index)*/ *, document <&> '香蕉' AS score FROM bm25_table ORDER BY document <&> '香蕉' DESC;
28. id | document | score
29. 1 | 小明喜欢吃香蕉 | .182321563363075
30. 2 | 香蕉是热带水果 | .182321563363075
31. (2 rows)
33. -- 使用bm25索引检索'小明喜欢吃什么'
34. openGauss=# SELECT /*+ indexscan (bm25_table bm25_index)*/ *, document <&> '小明喜欢吃什么' AS score FROM bm25_table ORDER BY document <&> '小明喜欢吃什么' DESC;
35. id | document | score
36. 1 | 小明喜欢吃香蕉 | 1.3862943649292
37. (1 rows)
39. --删除索引
40. openGauss=# DROP INDEX bm25_index;
41. DROP INDEX
