11---
2- title : 全文索引
2+ title : 全文索引(Full-Text Index)
33---
44
5- # 全文索引:实现闪电般快速的自动文本搜索
5+ ::: info
6+ 想要动手实践?请参阅 [ JSON 与搜索指南] ( /guides/query/json-search ) 。
7+ :::
8+
9+ # 全文索引(Full-Text Index):自动化的闪电般快速文本搜索
610
711import EEFeature from '@site/src /components/EEFeature';
812
913<EEFeature featureName =' INVERTED INDEX ' />
1014
11- 全文索引(倒排索引)通过建立词条到文档的映射关系,自动实现海量文档集合的闪电式文本检索,无需执行缓慢的全表扫描 。
15+ 全文索引(Full-Text Index,也称倒排索引 Inverted Index)通过将词条映射到文档,自动实现对大型文档集合的闪电般快速文本搜索,无需进行缓慢的全表扫描 。
1216
13- ## 解决哪些问题 ?
17+ ## 解决什么问题 ?
1418
15- 大规模数据集上的文本搜索面临显著性能挑战 :
19+ 大数据集上的文本搜索操作面临显著的性能挑战 :
1620
17- | 问题 | 影响 | 全文索引解决方案 |
21+ | 问题 | 影响 | 全文索引(Full-Text Index)解决方案 |
1822| ---------| --------| -------------------------|
19- | ** LIKE 查询缓慢** | ` WHERE content LIKE '%keyword%' ` 需扫描整表 | 直接词条定位 ,跳过无关文档 |
20- | ** 全表扫描** | 每次文本搜索都需读取所有行 | 仅读取包含搜索词条的文档 |
21- | ** 搜索体验差** | 用户需等待数秒/分钟获取结果 | 亚秒级搜索响应时间 |
22- | ** 搜索功能有限 ** | 仅支持基础模式匹配 | 支持高级功能 :模糊搜索、相关性评分 |
23- | ** 资源消耗高 ** | 文本搜索过度消耗 CPU/内存 | 索引搜索仅需最少资源 |
23+ | ** LIKE 查询缓慢** | ` WHERE content LIKE '%keyword%' ` 扫描整个表 | 直接词条查找 ,跳过无关文档 |
24+ | ** 全表扫描** | 每次文本搜索读取所有行 | 仅读取包含搜索词条的文档 |
25+ | ** 搜索体验差** | 用户等待数秒/数分钟才能获得搜索结果 | 亚秒级搜索响应时间 |
26+ | ** 搜索能力有限 ** | 仅支持基本模式匹配 | 高级功能 :模糊搜索、相关性评分 |
27+ | ** 资源使用率高 ** | 文本搜索消耗过多 CPU/内存 | 索引搜索所需资源极少 |
2428
25- ** 示例** :在 1000 万条日志中搜索 "kubernetes error"。无全文索引时需扫描全部 1000 万行,使用全文索引可直接定位约 1000 个匹配文档,瞬间返回结果 。
29+ ** 示例** :在 1000 万条日志记录中搜索 "kubernetes error"。没有全文索引时,需要扫描全部 1000 万行。使用全文索引后,可以直接找到约 1000 个匹配文档,瞬间完成 。
2630
2731## 工作原理
2832
29- 全文索引创建词条到文档的反向映射 :
33+ 全文索引创建从词条到文档的倒排映射 :
3034
3135| 词条 | 文档 ID |
3236| ------| -------------|
3337| "kubernetes" | 101, 205, 1847 |
3438| "error" | 101, 892, 1847 |
3539| "pod" | 205, 1847, 2901 |
3640
37- 搜索 "kubernetes error" 时,索引直接定位同时包含两个词条的文档 ( 101, 1847),无需扫描整表 。
41+ 搜索 "kubernetes error" 时,索引会找到同时包含这两个词条的文档( 101, 1847),无需扫描整个表 。
3842
39- ## 快速配置
43+ ## 快速设置
4044
4145``` sql
42- -- 创建含文本字段的表
46+ -- 创建包含文本内容的表
4347CREATE TABLE logs (id INT , message TEXT , timestamp TIMESTAMP );
4448
4549-- 创建全文索引 - 自动索引新数据
4650CREATE INVERTED INDEX logs_message_idx ON logs(message);
4751
48- -- 仅需对索引创建前已存在的数据执行一次性刷新
52+ -- 仅对索引创建前的现有数据需要一次性刷新
4953REFRESH INVERTED INDEX logs_message_idx ON logs;
5054
51- -- 使用 MATCH 函数搜索 - 自动优化执行
55+ -- 使用 MATCH 函数搜索 - 完全自动优化
5256SELECT * FROM logs WHERE MATCH(message, ' error kubernetes' );
5357```
5458
5559** 自动索引管理** :
56- - ** 新数据** :插入时自动索引,无需人工干预
57- - ** 存量数据 ** :仅需对索引创建前存在的数据执行一次性刷新
58- - ** 持续维护** :Databend 自动维护最优搜索性能
60+ - ** 新数据** :插入时自动索引 - 无需手动操作
61+ - ** 现有数据 ** :仅对索引创建前已存在的数据需要一次性刷新
62+ - ** 持续维护** :Databend 自动维护最佳搜索性能
5963
6064## 搜索函数
6165
6266| 函数 | 用途 | 示例 |
6367| ----------| ---------| ---------|
64- | ` MATCH(column, 'terms') ` | 基础文本搜索 | ` MATCH(content, 'database performance') ` |
68+ | ` MATCH(column, 'terms') ` | 基本文本搜索 | ` MATCH(content, 'database performance') ` |
6569| ` QUERY('column:terms') ` | 高级查询语法 | ` QUERY('title:"full text" AND content:search') ` |
6670| ` SCORE() ` | 相关性评分 | ` SELECT *, SCORE() FROM docs WHERE MATCH(...) ` |
6771
6872## 高级搜索功能
6973
7074### 模糊搜索
7175``` sql
72- -- 支持容错匹配 (fuzziness=1 允许 1 个字符差异)
73- SELECT * FROM logs WHERE MATCH(message, ' kuberntes ' , ' fuzziness=1' );
76+ -- 即使有拼写错误也能找到文档 (fuzziness=1 允许 1 个字符差异)
77+ SELECT * FROM logs WHERE MATCH(message, ' kubernetes ' , ' fuzziness=1' );
7478```
7579
7680### 相关性评分
7781``` sql
78- -- 获取带相关性评分的结果,按阈值过滤
82+ -- 获取带相关性评分的结果,按最低分数过滤
7983SELECT id, message, SCORE() as relevance
8084FROM logs
8185WHERE MATCH(message, ' critical error' ) AND SCORE() > 0 .5
8286ORDER BY SCORE() DESC ;
8387```
8488
85- ### 复合查询
89+ ### 复杂查询
8690``` sql
87- -- 支持布尔运算符的高级查询语法
91+ -- 使用布尔运算符的高级查询语法
8892SELECT * FROM docs WHERE QUERY(' title:"user guide" AND content:(tutorial OR example)' );
8993```
9094
9195## 完整示例
9296
93- 此示例演示在 Kubernetes 日志数据上创建全文索引并执行多样化搜索 :
97+ 此示例演示在 Kubernetes 日志数据上创建全文搜索索引并使用各种函数进行搜索 :
9498
9599``` sql
96- -- 创建含计算列的表
100+ -- 创建带计算列的表
97101CREATE TABLE k8s_logs (
98102 event_id INT ,
99103 event_data VARIANT,
100104 event_timestamp TIMESTAMP ,
101105 event_message VARCHAR AS (event_data[' message' ]::VARCHAR ) STORED
102106);
103107
104- -- 在 event_message 列创建倒排索引
108+ -- 在 " event_message" 列上创建倒排索引
105109CREATE INVERTED INDEX event_message_fulltext ON k8s_logs(event_message);
106110
107- -- 插入示例数据
111+ -- 插入综合示例数据
108112INSERT INTO k8s_logs (event_id, event_data, event_timestamp)
109113VALUES
110114 (1 ,
@@ -167,7 +171,7 @@ VALUES
167171 }' ),
168172 ' 2024-04-08T12:00:00Z' );
169173
170- -- 基础搜索:查找含 "PersistentVolume" 的事件
174+ -- 基本搜索包含 "PersistentVolume" 的事件
171175SELECT
172176 event_id,
173177 event_message
@@ -180,7 +184,7 @@ WHERE
180184 event_id: 5
181185event_message: PersistentVolume claim created
182186
183- -- 使用 EXPLAIN 验证索引使用
187+ -- 使用 EXPLAIN 验证索引使用情况
184188EXPLAIN SELECT event_id, event_message FROM k8s_logs WHERE MATCH(event_message, ' PersistentVolume' );
185189
186190- [ EXPLAIN ]-- ---------------------------------
@@ -217,7 +221,7 @@ WHERE
217221event_timestamp: 2024 - 04 - 08 12 :00 :00
218222 score(): 0 .86304635
219223
220- -- 模糊搜索示例(支持拼写容错 )
224+ -- 模糊搜索示例(处理拼写错误 )
221225SELECT
222226 event_id, event_message, event_timestamp
223227FROM
@@ -231,49 +235,49 @@ WHERE
231235event_timestamp: 2024 - 04 - 08 12 :00 :00
232236```
233237
234- ** 示例核心要点 ** :
235- - ` inverted pruning: 5 to 1 ` 表明索引将扫描块数从 5 降至 1
236- - 相关性评分实现按匹配质量排序结果
237- - 模糊搜索支持拼写差异(如 "create" 与 "created")
238+ ** 示例要点 ** :
239+ - ` inverted pruning: 5 to 1 ` 显示索引将扫描的块从 5 个减少到 1 个
240+ - 相关性评分有助于按匹配质量对结果排序
241+ - 模糊搜索即使有拼写错误也能找到结果( "create" vs "created")
238242
239243## 最佳实践
240244
241- | 实践方案 | 优势 |
245+ | 实践 | 优势 |
242246| ----------| ---------|
243- | ** 为高频搜索列创建索引 ** | 聚焦搜索查询中的目标列 |
244- | ** 使用 MATCH 替代 LIKE** | 充分发挥索引性能优势 |
245- | ** 监控索引使用状态 ** | 通过 EXPLAIN 验证索引生效情况 |
246- | ** 考虑多索引方案 ** | 不同列可建立独立索引 |
247+ | ** 索引常搜索列 ** | 专注于搜索查询中使用的列 |
248+ | ** 使用 MATCH 而非 LIKE** | 利用自动索引性能 |
249+ | ** 监控索引使用 ** | 使用 EXPLAIN 验证索引利用率 |
250+ | ** 考虑多个索引 ** | 不同列可以有单独的索引 |
247251
248- ## 核心命令
252+ ## 基本命令
249253
250- | 命令 | 用途 | 使用场景 |
254+ | 命令 | 用途 | 使用时机 |
251255| ---------| ---------| -------------|
252- | ` CREATE INVERTED INDEX name ON table(column) ` | 新建全文索引 | 初始配置 - 新数据自动索引 |
253- | ` REFRESH INVERTED INDEX name ON table ` | 索引存量数据 | 仅需对索引前数据执行一次 |
256+ | ` CREATE INVERTED INDEX name ON table(column) ` | 创建新的全文索引 | 初始设置 - 对新数据自动生效 |
257+ | ` REFRESH INVERTED INDEX name ON table ` | 索引现有数据 | 仅对预先存在的数据一次性使用 |
254258| ` DROP INVERTED INDEX name ON table ` | 删除索引 | 不再需要索引时 |
255259
256260## 重要说明
257261
258262::: tip
259- ** 适用场景 ** :
260- - 海量文本数据集 (文档/日志/ 评论)
261- - 高频文本搜索操作
262- - 需要高级搜索功能(模糊匹配/相关性评分 )
263- - 性能敏感的搜索应用
263+ ** 何时使用全文索引(Full-Text Index): **
264+ - 大型文本数据集 (文档、日志、 评论)
265+ - 频繁的文本搜索操作
266+ - 需要高级搜索功能(模糊、评分 )
267+ - 性能关键的搜索应用
264268
265- ** 非适用场景 ** :
269+ ** 何时不使用: **
266270- 小型文本数据集
267- - 仅需精确字符串匹配
268- - 低频搜索操作
271+ - 仅精确字符串匹配
272+ - 不频繁的搜索操作
269273:::
270274
271275## 索引限制
272276
273- - 单列仅能归属一个倒排索引
274- - 数据插入后需手动刷新(针对索引创建前已存在的数据 )
275- - 需额外存储空间存放索引数据
277+ - 每列只能在一个倒排索引中
278+ - 需要在数据插入后刷新(如果数据在索引创建前已存在 )
279+ - 索引数据使用额外的存储空间
276280
277281---
278282
279- * 全文索引是处理海量文档集合并实现高速、复杂文本搜索的关键组件 。*
283+ * 全文索引(Full-Text Index)对于需要在大型文档集合中进行快速、复杂文本搜索的应用至关重要 。*
0 commit comments