2
2
title : Ngram 索引
3
3
---
4
4
5
- # Ngram 索引: LIKE 查询的高速模式匹配
5
+ # Ngram 索引(Ngram Index):为 LIKE 查询实现快速模式匹配
6
6
7
7
import EEFeature from '@site/src /components/EEFeature';
8
8
9
9
<EEFeature featureName =' NGRAM INDEX ' />
10
10
11
- Ngram 索引通过带通配符 ( ` % ` ) 的 ` LIKE ` 操作符加速模式匹配查询,无需全表扫描即可实现快速子字符串搜索 。
11
+ Ngram 索引(Ngram Index)能够加速使用 ` LIKE ` 操作符和通配符( ` % ` )的模式匹配查询,实现快速的子字符串搜索,而无需进行全表扫描 。
12
12
13
- ## 解决什么问题 ?
13
+ ## 它解决了什么问题 ?
14
14
15
- ` LIKE ` 模式匹配在大数据集上存在显著性能挑战 :
15
+ 在使用 ` LIKE ` 进行模式匹配查询时,大型数据集会面临严峻的性能挑战 :
16
16
17
- | 问题 | 影响 | Ngram 索引解决方案 |
17
+ | 问题 | 影响 | Ngram 索引(Ngram Index)解决方案 |
18
18
| ---------| --------| ---------------------|
19
- | ** 通配符搜索慢 ** | ` WHERE content LIKE '%keyword%' ` 需扫描全表 | 使用 n-gram 片段预过滤数据块 |
20
- | ** 全表扫描** | 每次模式搜索都需读取所有行 | 仅读取包含模式的相关数据块 |
21
- | ** 搜索性能差 ** | 子字符串搜索结果等待时间长 | 亚秒级模式匹配响应时间 |
22
- | ** 传统索引失效 ** | B-tree 索引无法优化中间通配符 | 字符级索引处理任意通配符位置 |
19
+ | ** 通配符搜索缓慢 ** | ` WHERE content LIKE '%keyword%' ` 会扫描整个表 | 使用 n-gram 片段预过滤数据块 |
20
+ | ** 全表扫描** | 每次模式搜索都会读取所有行 | 仅读取包含模式的相关数据块 |
21
+ | ** 搜索性能不佳 ** | 用户等待子字符串搜索结果的时间很长 | 亚秒级模式匹配响应时间 |
22
+ | ** 传统索引效率低下 ** | B-tree 索引无法优化中间的通配符 | 字符级索引可处理任何通配符位置 |
23
23
24
- ** 示例** :在 1000 万条日志中搜索 ` '%error log%' ` 。无 ngram 索引时需扫描全部 1000 万行;使用 ngram 索引可立即预过滤至约 1000 个相关数据块 。
24
+ ** 示例** :在 1000 万条日志条目中搜索 ` '%error log%' ` 。如果没有 Ngram 索引(Ngram Index),查询会扫描全部 1000 万行。而使用 Ngram 索引(Ngram Index),查询可以立即将范围预过滤到约 1000 个相关的数据块 。
25
25
26
26
## Ngram 索引 vs 全文索引:如何选择?
27
27
28
- | 特性 | Ngram 索引 | 全文索引 |
28
+ | 特性 | Ngram 索引(Ngram Index) | 全文索引(Full-Text Index) |
29
29
| ---------| -------------| -----------------|
30
- | ** 主要用途 ** | ` LIKE '%pattern%' ` 模式匹配 | ` MATCH() ` 语义文本搜索 |
31
- | ** 搜索类型** | 精确子字符串匹配 | 基于词汇的搜索(含相关性) |
30
+ | ** 主要使用场景 ** | 使用 ` LIKE '%pattern%' ` 进行模式匹配 | 使用 ` MATCH() ` 进行语义文本搜索 |
31
+ | ** 搜索类型** | 精确子字符串匹配 | 基于词语的相关性搜索 |
32
32
| ** 查询语法** | ` WHERE column LIKE '%text%' ` | ` WHERE MATCH(column, 'text') ` |
33
- | ** 高级功能** | 不区分大小写匹配 | 模糊搜索、相关性评分、布尔运算符 |
34
- | ** 性能重点** | 加速现有 LIKE 查询 | 用高级搜索替代 LIKE |
35
- | ** 适用场景 ** | 日志分析、代码搜索、精确匹配 | 文档搜索、内容发现、搜索引擎 |
33
+ | ** 高级功能** | 不区分大小写的匹配 | 模糊搜索、相关性评分、布尔运算符 |
34
+ | ** 性能重点** | 加速现有的 LIKE 查询 | 用高级搜索功能替代 LIKE |
35
+ | ** 最适合 ** | 日志分析、代码搜索、精确模式匹配 | 文档搜索、内容发现、搜索引擎 |
36
36
37
- ** 选择 Ngram 索引当 :**
38
- - 需优化现有 ` LIKE '%pattern%' ` 查询
39
- - 要求精确子字符串匹配 (不区分大小写)
40
- - 处理日志 、代码或 ID 等结构化数据
41
- - 需提升性能但不改变查询语法
37
+ ** 选择 Ngram 索引(Ngram Index)的情况 :**
38
+ - 您需要优化现有的 ` LIKE '%pattern%' ` 查询
39
+ - 需要精确的子字符串匹配 (不区分大小写)
40
+ - 处理结构化数据,如日志 、代码或 ID
41
+ - 希望在不更改查询语法的情况下提高性能
42
42
43
- ** 选择全文索引当 :**
43
+ ** 选择全文索引(Full-Text Index)的情况 :**
44
44
- 为文档或内容构建搜索功能
45
45
- 需要模糊搜索、相关性评分或复杂查询
46
46
- 处理自然语言文本
47
- - 需要超越简单模式匹配的高级搜索能力
47
+ - 希望获得超越简单模式匹配的高级搜索能力
48
48
49
- ## 工作原理
49
+ ## Ngram 索引(Ngram Index) 工作原理
50
50
51
- Ngram 索引将文本拆分为重叠字符子串( n-gram)实现快速模式查找 :
51
+ Ngram 索引(Ngram Index)将文本分解为重叠的字符子串( n-gram),以实现快速的模式查找 :
52
52
53
- ** ` gram_size = 3 ` 示例 :**
53
+ ** ` gram_size = 3 ` 的示例 :**
54
54
``` text
55
- 输入: "The quick brown"
56
- N-grams: "The", "he ", "e q", " qu", "qui", "uic", "ick", "ck ", "k b", " br", "bro", "row", "own"
55
+ 输入: "The quick brown"
56
+ N-grams: "The", "he ", "e q", " qu", "qui", "uic", "ick", "ck ", "k b", " br", "bro", "row", "own"
57
57
```
58
58
59
- ** 查询处理流程 :**
59
+ ** 查询处理 :**
60
60
``` sql
61
61
SELECT * FROM t WHERE content LIKE ' %quick br%'
62
62
```
63
- 1 . 模式 ` 'quick br' ` 拆解为 n-gram: "qui", "uic", "ick", "ck ", "k b", " br"
64
- 2 . 索引过滤包含这些 n-gram 的数据块
65
- 3 . 完整 ` LIKE ` 过滤仅作用于预筛选数据块
66
-
67
- :::note ** 关键限制 **
68
- - 模式长度至少需 ` gram_size ` 字符(如 ` gram_size=3 ` 时 ` '%yo%' ` 无法使用索引 )
69
- - 匹配不区分大小写("FOO" 可匹配 "foo", "Foo", "fOo")
70
- - 仅支持 ` LIKE ` 操作符,不适用其他模式匹配函数
63
+ 1 . 模式 ` 'quick br' ` 被分词为 n-gram: "qui", "uic", "ick", "ck ", "k b", " br"
64
+ 2 . 索引过滤出包含这些 n-gram 的数据块
65
+ 3 . 完整的 ` LIKE ` 过滤器仅应用于预过滤的数据块
66
+
67
+ :::note ** 重要限制 **
68
+ - 模式长度必须至少为 ` gram_size ` 个字符(例如,当 ` gram_size=3 ` 时,像 ` '%yo%' ` 这样的短模式将不会使用索引 )
69
+ - 匹配不区分大小写("FOO" 会匹配 "foo"、 "Foo"、 "fOo")
70
+ - 仅适用于 ` LIKE ` 操作符,不适用于其他模式匹配函数
71
71
:::
72
72
73
73
## 快速设置
74
74
75
75
``` sql
76
- -- Create table with text content
76
+ -- 创建包含文本内容的表
77
77
CREATE TABLE logs (id INT , message STRING);
78
78
79
- -- Create ngram index with 3-character segments
79
+ -- 创建一个 n-gram 索引,分词长度为 3
80
80
CREATE NGRAM INDEX logs_message_idx ON logs(message) gram_size = 3 ;
81
81
82
- -- Insert data (automatically indexed)
82
+ -- 插入数据(将自动索引)
83
83
INSERT INTO logs VALUES (1 , ' Application error occurred' );
84
84
85
- -- Search using LIKE - automatically optimized
85
+ -- 使用 LIKE 进行搜索 - 将自动优化
86
86
SELECT * FROM logs WHERE message LIKE ' %error%' ;
87
87
```
88
88
89
89
## 完整示例
90
90
91
- 创建 ngram 索引进行日志分析并验证性能优势 :
91
+ 此示例演示了如何为日志分析创建 Ngram 索引(Ngram Index)并验证其性能优势 :
92
92
93
93
``` sql
94
- -- Create table for application logs
94
+ -- 为应用程序日志创建表
95
95
CREATE TABLE t_articles (
96
96
id INT ,
97
97
content STRING
98
98
);
99
99
100
- -- Create ngram index with 3-character segments
100
+ -- 创建一个 n-gram 索引,分词长度为 3
101
101
CREATE NGRAM INDEX ngram_idx_content
102
102
ON t_articles(content)
103
103
gram_size = 3 ;
104
104
105
- -- Verify index creation
105
+ -- 验证索引创建
106
106
SHOW INDEXES;
107
107
```
108
108
@@ -115,7 +115,7 @@ SHOW INDEXES;
115
115
```
116
116
117
117
``` sql
118
- -- Insert test data: 995 irrelevant rows + 5 target rows
118
+ -- 插入测试数据: 995 行不相关数据 + 5 行目标数据
119
119
INSERT INTO t_articles
120
120
SELECT number , CONCAT(' Random text number ' , number )
121
121
FROM numbers(995 );
@@ -127,10 +127,10 @@ INSERT INTO t_articles VALUES
127
127
(1004 , ' A moment of silence was observed' ),
128
128
(1005 , ' In silence, they understood each other' );
129
129
130
- -- Search with pattern matching
130
+ -- 使用模式匹配进行搜索
131
131
SELECT id, content FROM t_articles WHERE content LIKE ' %silence%' ;
132
132
133
- -- Verify index usage
133
+ -- 验证索引使用情况
134
134
EXPLAIN SELECT id, content FROM t_articles WHERE content LIKE ' %silence%' ;
135
135
```
136
136
@@ -149,41 +149,41 @@ TableScan
149
149
└── estimated rows: 15 .62
150
150
```
151
151
152
- ** 关键指标 :** ` bloom pruning: 2 to 1 ` 表明 ngram 索引在扫描前成功过滤了 50% 数据块 。
152
+ ** 关键性能指标 :** ` bloom pruning: 2 to 1 ` 表明 Ngram 索引(Ngram Index)在扫描前成功过滤掉了 50% 的数据块 。
153
153
154
154
## 最佳实践
155
155
156
- | 实践 | 优势 |
156
+ | 实践 | 益处 |
157
157
| ----------| ---------|
158
- | ** 选择合适的 gram_size** | ` gram_size=3 ` 适用多数场景;更长模式用更大值 |
159
- | ** 索引高频搜索列 ** | 聚焦于 ` LIKE '%pattern%' ` 查询使用的列 |
160
- | ** 监控索引使用 ** | 通过 ` EXPLAIN ` 验证 ` bloom pruning ` 统计 |
161
- | ** 注意模式长度 ** | 确保搜索模式长度 ≥ ` gram_size ` |
162
-
163
- ## 核心命令
164
-
165
- 完整命令参考详见 [ Ngram 索引] ( /sql/sql-commands/ddl/ngram-index/ ) 。
166
-
167
- | 命令 | 用途 |
168
- | ----------------------------------------------------------| ----------------------|
169
- | ` CREATE NGRAM INDEX name ON table(column) gram_size = N ` | 创建含 N 字符片段的 ngram 索引 |
170
- | ` SHOW INDEXES ` | 列出所有索引(含 ngram 索引) |
171
- | ` REFRESH NGRAM INDEX name ON table ` | 刷新 ngram 索引 |
172
- | ` DROP NGRAM INDEX name ON table ` | 删除 ngram 索引 |
173
-
174
- :::tip ** 使用场景 **
175
- ** 适用 :**
176
- - 日志分析与监控系统
177
- - 代码搜索与模式匹配
158
+ | ** 选择合适的 gram_size** | ` gram_size=3 ` 适用于大多数情况;对于更长的模式使用更大的值 |
159
+ | ** 为频繁搜索的列创建索引 ** | 专注于在 ` LIKE '%pattern%' ` 查询中使用的列 |
160
+ | ** 监控索引使用情况 ** | 使用 ` EXPLAIN ` 验证 ` bloom pruning ` 统计信息 |
161
+ | ** 考虑模式长度 ** | 确保搜索模式的长度至少为 ` gram_size ` 个字符 |
162
+
163
+ ## 基本命令
164
+
165
+ 有关完整的命令参考,请参见 [ Ngram 索引(Ngram Index) ] ( /sql/sql-commands/ddl/ngram-index/ ) 。
166
+
167
+ | 命令 | 目的 |
168
+ | ----------------------------------------------------------| ---------------------------------------------- |
169
+ | ` CREATE NGRAM INDEX name ON table(column) gram_size = N ` | 创建一个 n-gram 索引,分词长度为 N |
170
+ | ` SHOW INDEXES ` | 列出所有索引,包括 n-gram 索引 |
171
+ | ` REFRESH NGRAM INDEX name ON table ` | 刷新 n-gram 索引 |
172
+ | ` DROP NGRAM INDEX name ON table ` | 删除 n-gram 索引 |
173
+
174
+ :::tip ** 何时使用 Ngram 索引(Ngram Index) **
175
+ ** 理想场景 :**
176
+ - 日志分析和监控系统
177
+ - 代码搜索和模式匹配
178
178
- 产品目录搜索
179
- - 高频使用 ` LIKE '%pattern%' ` 的应用
179
+ - 任何频繁使用 ` LIKE '%pattern%' ` 查询的应用
180
180
181
- ** 不适用 :**
182
- - 短模式搜索(短于 ` gram_size ` 字符 )
183
- - 精确字符串匹配(应使用等值比较 )
184
- - 复杂文本搜索 (应使用全文索引)
181
+ ** 不推荐的场景 :**
182
+ - 短模式搜索(长度小于 ` gram_size ` 个字符 )
183
+ - 精确字符串匹配(应使用等号比较 )
184
+ - 复杂的文本搜索需求 (应使用全文索引(Full-Text Index) )
185
185
:::
186
186
187
187
---
188
188
189
- * Ngram 索引是大型文本数据集上实现 ` LIKE ` 查询高速模式匹配的关键组件 。*
189
+ * 对于需要在大型文本数据集上使用 ` LIKE ` 查询进行快速模式匹配的应用,Ngram 索引(Ngram Index)至关重要 。*
0 commit comments