22title : Ngram 索引
33---
44
5- # Ngram 索引: LIKE 查询的高速模式匹配
5+ # Ngram 索引(Ngram Index):为 LIKE 查询实现快速模式匹配
66
77import EEFeature from '@site/src /components/EEFeature';
88
99<EEFeature featureName =' NGRAM INDEX ' />
1010
11- Ngram 索引通过带通配符 ( ` % ` ) 的 ` LIKE ` 操作符加速模式匹配查询,无需全表扫描即可实现快速子字符串搜索 。
11+ Ngram 索引(Ngram Index)能够加速使用 ` LIKE ` 操作符和通配符( ` % ` )的模式匹配查询,实现快速的子字符串搜索,而无需进行全表扫描 。
1212
13- ## 解决什么问题 ?
13+ ## 它解决了什么问题 ?
1414
15- ` LIKE ` 模式匹配在大数据集上存在显著性能挑战 :
15+ 在使用 ` LIKE ` 进行模式匹配查询时,大型数据集会面临严峻的性能挑战 :
1616
17- | 问题 | 影响 | Ngram 索引解决方案 |
17+ | 问题 | 影响 | Ngram 索引(Ngram Index)解决方案 |
1818| ---------| --------| ---------------------|
19- | ** 通配符搜索慢 ** | ` WHERE content LIKE '%keyword%' ` 需扫描全表 | 使用 n-gram 片段预过滤数据块 |
20- | ** 全表扫描** | 每次模式搜索都需读取所有行 | 仅读取包含模式的相关数据块 |
21- | ** 搜索性能差 ** | 子字符串搜索结果等待时间长 | 亚秒级模式匹配响应时间 |
22- | ** 传统索引失效 ** | B-tree 索引无法优化中间通配符 | 字符级索引处理任意通配符位置 |
19+ | ** 通配符搜索缓慢 ** | ` WHERE content LIKE '%keyword%' ` 会扫描整个表 | 使用 n-gram 片段预过滤数据块 |
20+ | ** 全表扫描** | 每次模式搜索都会读取所有行 | 仅读取包含模式的相关数据块 |
21+ | ** 搜索性能不佳 ** | 用户等待子字符串搜索结果的时间很长 | 亚秒级模式匹配响应时间 |
22+ | ** 传统索引效率低下 ** | B-tree 索引无法优化中间的通配符 | 字符级索引可处理任何通配符位置 |
2323
24- ** 示例** :在 1000 万条日志中搜索 ` '%error log%' ` 。无 ngram 索引时需扫描全部 1000 万行;使用 ngram 索引可立即预过滤至约 1000 个相关数据块 。
24+ ** 示例** :在 1000 万条日志条目中搜索 ` '%error log%' ` 。如果没有 Ngram 索引(Ngram Index),查询会扫描全部 1000 万行。而使用 Ngram 索引(Ngram Index),查询可以立即将范围预过滤到约 1000 个相关的数据块 。
2525
2626## Ngram 索引 vs 全文索引:如何选择?
2727
28- | 特性 | Ngram 索引 | 全文索引 |
28+ | 特性 | Ngram 索引(Ngram Index) | 全文索引(Full-Text Index) |
2929| ---------| -------------| -----------------|
30- | ** 主要用途 ** | ` LIKE '%pattern%' ` 模式匹配 | ` MATCH() ` 语义文本搜索 |
31- | ** 搜索类型** | 精确子字符串匹配 | 基于词汇的搜索(含相关性) |
30+ | ** 主要使用场景 ** | 使用 ` LIKE '%pattern%' ` 进行模式匹配 | 使用 ` MATCH() ` 进行语义文本搜索 |
31+ | ** 搜索类型** | 精确子字符串匹配 | 基于词语的相关性搜索 |
3232| ** 查询语法** | ` WHERE column LIKE '%text%' ` | ` WHERE MATCH(column, 'text') ` |
33- | ** 高级功能** | 不区分大小写匹配 | 模糊搜索、相关性评分、布尔运算符 |
34- | ** 性能重点** | 加速现有 LIKE 查询 | 用高级搜索替代 LIKE |
35- | ** 适用场景 ** | 日志分析、代码搜索、精确匹配 | 文档搜索、内容发现、搜索引擎 |
33+ | ** 高级功能** | 不区分大小写的匹配 | 模糊搜索、相关性评分、布尔运算符 |
34+ | ** 性能重点** | 加速现有的 LIKE 查询 | 用高级搜索功能替代 LIKE |
35+ | ** 最适合 ** | 日志分析、代码搜索、精确模式匹配 | 文档搜索、内容发现、搜索引擎 |
3636
37- ** 选择 Ngram 索引当 :**
38- - 需优化现有 ` LIKE '%pattern%' ` 查询
39- - 要求精确子字符串匹配 (不区分大小写)
40- - 处理日志 、代码或 ID 等结构化数据
41- - 需提升性能但不改变查询语法
37+ ** 选择 Ngram 索引(Ngram Index)的情况 :**
38+ - 您需要优化现有的 ` LIKE '%pattern%' ` 查询
39+ - 需要精确的子字符串匹配 (不区分大小写)
40+ - 处理结构化数据,如日志 、代码或 ID
41+ - 希望在不更改查询语法的情况下提高性能
4242
43- ** 选择全文索引当 :**
43+ ** 选择全文索引(Full-Text Index)的情况 :**
4444- 为文档或内容构建搜索功能
4545- 需要模糊搜索、相关性评分或复杂查询
4646- 处理自然语言文本
47- - 需要超越简单模式匹配的高级搜索能力
47+ - 希望获得超越简单模式匹配的高级搜索能力
4848
49- ## 工作原理
49+ ## Ngram 索引(Ngram Index) 工作原理
5050
51- Ngram 索引将文本拆分为重叠字符子串( n-gram)实现快速模式查找 :
51+ Ngram 索引(Ngram Index)将文本分解为重叠的字符子串( n-gram),以实现快速的模式查找 :
5252
53- ** ` gram_size = 3 ` 示例 :**
53+ ** ` gram_size = 3 ` 的示例 :**
5454``` 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"
5757```
5858
59- ** 查询处理流程 :**
59+ ** 查询处理 :**
6060``` sql
6161SELECT * FROM t WHERE content LIKE ' %quick br%'
6262```
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 ` 操作符,不适用于其他模式匹配函数
7171:::
7272
7373## 快速设置
7474
7575``` sql
76- -- Create table with text content
76+ -- 创建包含文本内容的表
7777CREATE TABLE logs (id INT , message STRING);
7878
79- -- Create ngram index with 3-character segments
79+ -- 创建一个 n-gram 索引,分词长度为 3
8080CREATE NGRAM INDEX logs_message_idx ON logs(message) gram_size = 3 ;
8181
82- -- Insert data (automatically indexed)
82+ -- 插入数据(将自动索引)
8383INSERT INTO logs VALUES (1 , ' Application error occurred' );
8484
85- -- Search using LIKE - automatically optimized
85+ -- 使用 LIKE 进行搜索 - 将自动优化
8686SELECT * FROM logs WHERE message LIKE ' %error%' ;
8787```
8888
8989## 完整示例
9090
91- 创建 ngram 索引进行日志分析并验证性能优势 :
91+ 此示例演示了如何为日志分析创建 Ngram 索引(Ngram Index)并验证其性能优势 :
9292
9393``` sql
94- -- Create table for application logs
94+ -- 为应用程序日志创建表
9595CREATE TABLE t_articles (
9696 id INT ,
9797 content STRING
9898);
9999
100- -- Create ngram index with 3-character segments
100+ -- 创建一个 n-gram 索引,分词长度为 3
101101CREATE NGRAM INDEX ngram_idx_content
102102ON t_articles(content)
103103gram_size = 3 ;
104104
105- -- Verify index creation
105+ -- 验证索引创建
106106SHOW INDEXES;
107107```
108108
@@ -115,7 +115,7 @@ SHOW INDEXES;
115115```
116116
117117``` sql
118- -- Insert test data: 995 irrelevant rows + 5 target rows
118+ -- 插入测试数据: 995 行不相关数据 + 5 行目标数据
119119INSERT INTO t_articles
120120SELECT number , CONCAT(' Random text number ' , number )
121121FROM numbers(995 );
@@ -127,10 +127,10 @@ INSERT INTO t_articles VALUES
127127 (1004 , ' A moment of silence was observed' ),
128128 (1005 , ' In silence, they understood each other' );
129129
130- -- Search with pattern matching
130+ -- 使用模式匹配进行搜索
131131SELECT id, content FROM t_articles WHERE content LIKE ' %silence%' ;
132132
133- -- Verify index usage
133+ -- 验证索引使用情况
134134EXPLAIN SELECT id, content FROM t_articles WHERE content LIKE ' %silence%' ;
135135```
136136
@@ -149,41 +149,41 @@ TableScan
149149└── estimated rows: 15 .62
150150```
151151
152- ** 关键指标 :** ` bloom pruning: 2 to 1 ` 表明 ngram 索引在扫描前成功过滤了 50% 数据块 。
152+ ** 关键性能指标 :** ` bloom pruning: 2 to 1 ` 表明 Ngram 索引(Ngram Index)在扫描前成功过滤掉了 50% 的数据块 。
153153
154154## 最佳实践
155155
156- | 实践 | 优势 |
156+ | 实践 | 益处 |
157157| ----------| ---------|
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+ - 代码搜索和模式匹配
178178- 产品目录搜索
179- - 高频使用 ` LIKE '%pattern%' ` 的应用
179+ - 任何频繁使用 ` LIKE '%pattern%' ` 查询的应用
180180
181- ** 不适用 :**
182- - 短模式搜索(短于 ` gram_size ` 字符 )
183- - 精确字符串匹配(应使用等值比较 )
184- - 复杂文本搜索 (应使用全文索引)
181+ ** 不推荐的场景 :**
182+ - 短模式搜索(长度小于 ` gram_size ` 个字符 )
183+ - 精确字符串匹配(应使用等号比较 )
184+ - 复杂的文本搜索需求 (应使用全文索引(Full-Text Index) )
185185:::
186186
187187---
188188
189- * Ngram 索引是大型文本数据集上实现 ` LIKE ` 查询高速模式匹配的关键组件 。*
189+ * 对于需要在大型文本数据集上使用 ` LIKE ` 查询进行快速模式匹配的应用,Ngram 索引(Ngram Index)至关重要 。*
0 commit comments