Skip to content

Commit 9e9f801

Browse files
Add LLM Translations V2 (#2353)
## ✅ Translated to Simplified-Chinese - 1 file | **Source** | **Output/Count** | **Language** | | :--- | :--- | :--- | | `docs/en/guides/55-performance/ngram-index.md` | `docs/cn/guides/55-performance/ngram-index.md` | Simplified-Chinese | Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 7d73975 commit 9e9f801

File tree

1 file changed

+142
-31
lines changed

1 file changed

+142
-31
lines changed

docs/cn/guides/55-performance/ngram-index.md

Lines changed: 142 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,187 @@
22
title: Ngram 索引
33
---
44

5-
# Ngram 索引:LIKE 查询的快速模式匹配
5+
# Ngram 索引:LIKE 查询的高速模式匹配
66

77
import EEFeature from '@site/src/components/EEFeature';
88

99
<EEFeature featureName='NGRAM INDEX'/>
1010

11-
Ngram 索引通过带通配符 (`%`) 的 `LIKE` 运算符加速模式匹配查询,实现无需全表扫描的快速子字符串搜索
11+
Ngram 索引通过带通配符 (`%`) 的 `LIKE` 操作符加速模式匹配查询,无需全表扫描即可实现快速子字符串搜索
1212

1313
## 解决什么问题?
1414

15-
`LIKE` 查询在大型数据集上进行模式匹配时面临显著性能挑战
15+
`LIKE` 模式匹配在大数据集上存在显著性能挑战
1616

1717
| 问题 | 影响 | Ngram 索引解决方案 |
1818
|---------|--------|---------------------|
19-
| **通配符搜索缓慢** | `WHERE content LIKE '%keyword%'` 需扫描全表 | 使用 n-gram 分段预过滤数据块 |
20-
| **全表扫描** | 每次模式搜索需读取所有行 | 仅读取包含模式的相关数据块 |
21-
| **搜索性能差** | 用户需长时间等待子字符串搜索结果 | 亚秒级模式匹配响应速度 |
19+
| **通配符搜索慢** | `WHERE content LIKE '%keyword%'` 需扫描全表 | 使用 n-gram 片段预过滤数据块 |
20+
| **全表扫描** | 每次模式搜索都需读取所有行 | 仅读取包含模式的相关数据块 |
21+
| **搜索性能差** | 子字符串搜索结果等待时间长 | 亚秒级模式匹配响应时间 |
2222
| **传统索引失效** | B-tree 索引无法优化中间通配符 | 字符级索引处理任意通配符位置 |
2323

24-
**示例**:在 1000 万条日志中搜索 `'%error log%'`。无 ngram 索引时需扫描全部数据;启用后瞬间预过滤至约 1000 个相关块
24+
**示例**:在 1000 万条日志中搜索 `'%error log%'`。无 ngram 索引时需扫描全部 1000 万行;使用 ngram 索引可立即预过滤至约 1000 个相关数据块
2525

26-
## Ngram 与全文索引:如何选择?
26+
## Ngram 索引 vs 全文索引:如何选择?
2727

28-
| 功能 | Ngram 索引 | 全文索引 |
28+
| 特性 | Ngram 索引 | 全文索引 |
2929
|---------|-------------|-----------------|
30-
| **主要用例** | `LIKE '%pattern%'` 模式匹配 | `MATCH()` 语义文本搜索 |
31-
| **搜索类型** | 精确子字符串匹配 | 基于词汇的相关性搜索 |
30+
| **主要用途** | `LIKE '%pattern%'` 模式匹配 | `MATCH()` 语义文本搜索 |
31+
| **搜索类型** | 精确子字符串匹配 | 基于词汇的搜索(含相关性) |
3232
| **查询语法** | `WHERE column LIKE '%text%'` | `WHERE MATCH(column, 'text')` |
3333
| **高级功能** | 不区分大小写匹配 | 模糊搜索、相关性评分、布尔运算符 |
3434
| **性能重点** | 加速现有 LIKE 查询 | 用高级搜索替代 LIKE |
35-
| **最佳场景** | 日志分析、代码搜索、精确匹配 | 文档搜索、内容发现、搜索引擎 |
35+
| **适用场景** | 日志分析、代码搜索、精确匹配 | 文档搜索、内容发现、搜索引擎 |
3636

37-
**选择 Ngram 索引**
37+
**选择 Ngram 索引当**
3838
- 需优化现有 `LIKE '%pattern%'` 查询
3939
- 要求精确子字符串匹配(不区分大小写)
4040
- 处理日志、代码或 ID 等结构化数据
41-
- 期望不修改查询语法提升性能
41+
- 需提升性能但不改变查询语法
4242

43-
**选择全文索引**
44-
- 构建文档/内容搜索功能
43+
**选择全文索引当**
44+
- 为文档或内容构建搜索功能
4545
- 需要模糊搜索、相关性评分或复杂查询
4646
- 处理自然语言文本
47-
- 需超越简单模式匹配的高级搜索能力
47+
- 需要超越简单模式匹配的高级搜索能力
4848

4949
## 工作原理
5050

51-
Ngram 索引将文本拆解为重叠字符子串(n-grams)实现快速模式查找:
51+
Ngram 索引将文本拆分为重叠字符子串(n-gram)实现快速模式查找:
5252

5353
**`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

5959
**查询处理流程:**
6060
```sql
6161
SELECT * FROM t WHERE content LIKE '%quick br%'
6262
```
63-
1. 模式 `'quick br'` 被拆解为 n-grams:"qui", "uic", "ick", "ck ", "k b", " br"
64-
2. 索引过滤包含这些 n-grams 的数据块
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

73-
## 快速配置
73+
## 快速设置
7474

7575
```sql
76-
-- 创建含文本字段的表
77-
CREATE
76+
-- Create table with text content
77+
CREATE TABLE logs(id INT, message STRING);
78+
79+
-- Create ngram index with 3-character segments
80+
CREATE NGRAM INDEX logs_message_idx ON logs(message) gram_size = 3;
81+
82+
-- Insert data (automatically indexed)
83+
INSERT INTO logs VALUES (1, 'Application error occurred');
84+
85+
-- Search using LIKE - automatically optimized
86+
SELECT * FROM logs WHERE message LIKE '%error%';
87+
```
88+
89+
## 完整示例
90+
91+
创建 ngram 索引进行日志分析并验证性能优势:
92+
93+
```sql
94+
-- Create table for application logs
95+
CREATE TABLE t_articles (
96+
id INT,
97+
content STRING
98+
);
99+
100+
-- Create ngram index with 3-character segments
101+
CREATE NGRAM INDEX ngram_idx_content
102+
ON t_articles(content)
103+
gram_size = 3;
104+
105+
-- Verify index creation
106+
SHOW INDEXES;
107+
```
108+
109+
```sql
110+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
111+
│ name │ type │ original │ definition │ created_on │ updated_on │
112+
├───────────────────┼────────┼──────────┼──────────────────────────────────┼────────────────────────────┼─────────────────────┤
113+
│ ngram_idx_content │ NGRAM │ │ t_articles(content)gram_size='3'2025-05-13 01:02:58.598409NULL
114+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
115+
```
116+
117+
```sql
118+
-- Insert test data: 995 irrelevant rows + 5 target rows
119+
INSERT INTO t_articles
120+
SELECT number, CONCAT('Random text number ', number)
121+
FROM numbers(995);
122+
123+
INSERT INTO t_articles VALUES
124+
(1001, 'The silence was deep and complete'),
125+
(1002, 'They walked in silence through the woods'),
126+
(1003, 'Silence fell over the room'),
127+
(1004, 'A moment of silence was observed'),
128+
(1005, 'In silence, they understood each other');
129+
130+
-- Search with pattern matching
131+
SELECT id, content FROM t_articles WHERE content LIKE '%silence%';
132+
133+
-- Verify index usage
134+
EXPLAIN SELECT id, content FROM t_articles WHERE content LIKE '%silence%';
135+
```
136+
137+
**性能结果:**
138+
```sql
139+
-[ EXPLAIN ]-----------------------------------
140+
TableScan
141+
├── table: default.default.t_articles
142+
├── output columns: [id (#0), content (#1)]
143+
├── read rows: 5
144+
├── read size: < 1 KiB
145+
├── partitions total: 2
146+
├── partitions scanned: 1
147+
├── pruning stats: [segments: <range pruning: 2 to 2>, blocks: <range pruning: 2 to 2, bloom pruning: 2 to 1>]
148+
├── push downs: [filters: [is_true(like(t_articles.content (#1), '%silence%'))], limit: NONE]
149+
└── estimated rows: 15.62
150+
```
151+
152+
**关键指标:** `bloom pruning: 2 to 1` 表明 ngram 索引在扫描前成功过滤了 50% 数据块。
153+
154+
## 最佳实践
155+
156+
| 实践 | 优势 |
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+
| `DROP NGRAM INDEX name ON table` | 删除 ngram 索引 |
172+
173+
:::tip **使用场景**
174+
**适用:**
175+
- 日志分析与监控系统
176+
- 代码搜索与模式匹配
177+
- 产品目录搜索
178+
- 高频使用 `LIKE '%pattern%'` 的应用
179+
180+
**不适用:**
181+
- 短模式搜索(短于 `gram_size` 字符)
182+
- 精确字符串匹配(应使用等值比较)
183+
- 复杂文本搜索(应使用全文索引)
184+
:::
185+
186+
---
187+
188+
*Ngram 索引是大型文本数据集上实现 `LIKE` 查询高速模式匹配的关键组件。*

0 commit comments

Comments
 (0)