Skip to content

Commit 07cbb0e

Browse files
💬Generate LLM translations (#2111)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 2fda0e0 commit 07cbb0e

File tree

6 files changed

+307
-2
lines changed

6 files changed

+307
-2
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
---
2+
title: Ngram 索引
3+
---
4+
5+
import EEFeature from '@site/src/components/EEFeature';
6+
7+
<EEFeature featureName='NGRAM INDEX'/>
8+
9+
Ngram 索引是一种专门的索引技术,可以提高使用带有 `%` 通配符的 `LIKE` 运算符的模式匹配查询的性能。这些查询在需要子字符串或模糊匹配的应用程序中很常见,例如在产品描述、用户评论或日志数据中搜索关键字。
10+
11+
与传统索引不同,当搜索模式没有固定前缀时(例如,`LIKE '%keyword%'`),传统索引通常无效,Ngram 索引将文本分解为重叠的子字符串(n-gram)并对其进行索引以实现快速查找。这使得 Databend 能够有效地缩小匹配行的范围,避免代价昂贵的全表扫描。
12+
13+
## Ngram 索引的工作原理
14+
15+
Databend 中的 Ngram 索引是使用字符级 n-gram 构建的。当对列进行索引时,其文本内容被视为连续的字符序列,包括字母、空格和标点符号。然后,文本被分割成所有可能的固定长度的重叠子字符串,由 gram_size 参数定义。
16+
17+
例如,对于 `gram_size = 3`,字符串:
18+
19+
```text
20+
The quick brown
21+
```
22+
23+
将被分割成以下 3 个字符的子字符串:
24+
25+
```text
26+
"The", "he ", "e q", " qu", "qui", "uic", "ick", "ck ", "k b", " br", "bro", "row", "own"
27+
```
28+
29+
这些子字符串存储在索引中,并用于加速使用 `LIKE` 运算符的查询中的模式匹配。
30+
当查询例如:
31+
32+
```sql
33+
SELECT * FROM t WHERE content LIKE '%quick br%'
34+
```
35+
36+
发出时,条件 `%quick br%` 也会被标记化为三元组,例如 "qui", "uic", "ick", "ck ", "k b", " br" 等。Databend 使用这些通过 n-gram 索引过滤数据块,然后再应用完整的 `LIKE` 过滤器,从而显著减少扫描的数据量。
37+
38+
:::note
39+
- 仅当要匹配的模式至少与 `gram_size` 一样长时,索引才有效。短模式(例如,gram_size = 3 的 '%yo%')不会从索引中受益。
40+
41+
- 使用 Ngram 索引时,匹配不区分大小写。例如,搜索 "FOO" 将匹配 "foo"、"Foo" 或 "fOo"。
42+
:::
43+
44+
## 管理 Ngram 索引
45+
46+
Databend 提供了各种命令来管理 Ngram 索引。有关详细信息,请参见 [Ngram 索引](/sql/sql-commands/ddl/ngram-index/)
47+
48+
## 使用示例
49+
50+
要加速使用 `LIKE` 运算符的模糊字符串搜索,可以在表的一个或多个 STRING 列上创建 Ngram 索引。此示例显示了如何创建表、定义 Ngram 索引、插入示例数据以及验证索引是否在查询计划中使用。
51+
52+
首先,创建一个简单的表来存储文本数据:
53+
54+
```sql
55+
CREATE TABLE t_articles (
56+
id INT,
57+
content STRING
58+
);
59+
```
60+
61+
接下来,在 `content` 列上创建一个 Ngram 索引。`gram_size` 参数定义每个 n-gram 段中使用的字符数:
62+
63+
```sql
64+
CREATE NGRAM INDEX ngram_idx_content
65+
ON t_articles(content)
66+
gram_size = 3;
67+
```
68+
69+
要显示创建的索引:
70+
71+
```sql
72+
SHOW INDEXES;
73+
```
74+
75+
```sql
76+
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
77+
│ name │ type │ original │ definition │ created_on │ updated_on │
78+
├───────────────────┼────────┼──────────┼──────────────────────────────────┼────────────────────────────┼─────────────────────┤
79+
│ ngram_idx_content │ NGRAM │ │ t_articles(content)gram_size='3'2025-05-13 01:02:58.598409NULL
80+
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
81+
```
82+
83+
现在插入大量行。大多数条目包含不相关的文本,但少数条目包含我们稍后要匹配的关键字:
84+
85+
```sql
86+
-- 插入 995 个不相关的行
87+
INSERT INTO t_articles
88+
SELECT number, CONCAT('Random text number ', number)
89+
FROM numbers(995);
90+
91+
-- 插入 5 行带有目标关键字的行
92+
INSERT INTO t_articles VALUES
93+
(1001, 'The silence was deep and complete'),
94+
(1002, 'They walked in silence through the woods'),
95+
(1003, 'Silence fell over the room'),
96+
(1004, 'A moment of silence was observed'),
97+
(1005, 'In silence, they understood each other');
98+
```
99+
100+
现在使用 `LIKE '%silence%'` 模式运行查询。这是 Ngram 索引变得有用的地方:
101+
102+
```sql
103+
EXPLAIN SELECT id, content FROM t_articles WHERE content LIKE '%silence%';
104+
```
105+
106+
`EXPLAIN` 输出中,在 `pruning stats` 行中查找 `bloom pruning` 详细信息:
107+
108+
```sql
109+
-[ EXPLAIN ]-----------------------------------
110+
TableScan
111+
├── table: default.default.t_articles
112+
├── output columns: [id (#0), content (#1)]
113+
├── read rows: 5
114+
├── read size: < 1 KiB
115+
├── partitions total: 2
116+
├── partitions scanned: 1
117+
├── pruning stats: [segments: <range pruning: 2 to 2>, blocks: <range pruning: 2 to 2, bloom pruning: 2 to 1>]
118+
├── push downs: [filters: [is_true(like(t_articles.content (#1), '%silence%'))], limit: NONE]
119+
└── estimated rows: 15.62
120+
```
121+
122+
这里,`bloom pruning: 2 to 1` 表明 Ngram 索引在扫描之前成功过滤掉了两个数据块中的一个。

docs/cn/sql-reference/00-sql-reference/31-system-tables/system-indexes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import FunctionDescription from '@site/src/components/FunctionDescription';
66

77
<FunctionDescription description="Introduced: v1.1.50"/>
88

9-
包含有关已创建的聚合索引的信息
9+
包含有关已创建索引的信息
1010

11-
另请参阅:[SHOW INDEXES](../../10-sql-commands/00-ddl/07-aggregating-index/show-indexes.md)
11+
另请参阅:[SHOW INDEXES](../../10-sql-commands/50-administration-cmds/show-indexes.md)
1212

1313
```sql
1414
CREATE TABLE t1(a int,b int);
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
---
2+
title: CREATE NGRAM INDEX
3+
sidebar_position: 1
4+
---
5+
6+
import FunctionDescription from '@site/src/components/FunctionDescription';
7+
8+
<FunctionDescription description="Introduced or updated: v1.2.726"/>
9+
10+
import EEFeature from '@site/src/components/EEFeature';
11+
12+
<EEFeature featureName='NGRAM INDEX'/>
13+
14+
为表的一个或多个列创建 Ngram 索引。
15+
16+
## 语法
17+
18+
```sql
19+
-- 在现有表上创建 Ngram 索引
20+
CREATE [OR REPLACE] NGRAM INDEX [IF NOT EXISTS] <index_name>
21+
ON [<database>.]<table_name>(<column1> [, <column2>, ...])
22+
[gram_size = <number>] [bitmap_size = <number>]
23+
24+
-- 创建表时创建 Ngram 索引
25+
CREATE [OR REPLACE] TABLE <table_name> (
26+
<column_definitions>,
27+
NGRAM INDEX <index_name> (<column1> [, <column2>, ...])
28+
[gram_size = <number>] [bitmap_size = <number>]
29+
)...
30+
```
31+
32+
- `gram_size` (默认为 3) 指定索引列文本时,每个基于字符的子字符串(n-gram)的长度。例如,当 `gram_size = 3` 时,文本 "hello world" 将被分割成如下重叠的子字符串:
33+
34+
```text
35+
"hel", "ell", "llo", "lo ", "o w", " wo", "wor", "orl", "rld"
36+
```
37+
38+
- `bloom_size` 指定 Bloom filter 位图的大小(以字节为单位),用于加速每个数据块中的字符串匹配。它控制索引准确性和内存使用之间的权衡:
39+
40+
- 较大的 `bloom_size` 减少了字符串查找中的误报,从而提高了查询精度,但代价是需要更多的内存。
41+
- 较小的 `bloom_size` 节省了内存,但可能会增加误报。
42+
- 如果未显式设置,则默认值为每个索引列每个块 1,048,576 字节(1m)。有效范围为 512 字节到 10,485,760 字节(10m)。
43+
44+
## 示例
45+
46+
以下示例创建了一个表 `amazon_reviews_ngram`,并在 `review_body` 列上创建了一个 Ngram 索引。该索引配置了 `gram_size` 为 10 和 `bitmap_size` 为 2 MB,以优化大型文本字段(如用户评论)上的模糊搜索性能。
47+
48+
```sql
49+
CREATE OR REPLACE TABLE amazon_reviews_ngram (
50+
review_date int(11) NULL,
51+
marketplace varchar(20) NULL,
52+
customer_id bigint(20) NULL,
53+
review_id varchar(40) NULL,
54+
product_id varchar(10) NULL,
55+
product_parent bigint(20) NULL,
56+
product_title varchar(500) NULL,
57+
product_category varchar(50) NULL,
58+
star_rating smallint(6) NULL,
59+
helpful_votes int(11) NULL,
60+
total_votes int(11) NULL,
61+
vine boolean NULL,
62+
verified_purchase boolean NULL,
63+
review_headline varchar(500) NULL,
64+
review_body string NULL,
65+
NGRAM INDEX idx1 (review_body) gram_size = 10 bloom_size = 2097152
66+
) Engine = Fuse bloom_index_columns='review_body';
67+
```
68+
69+
要显示创建的索引,请使用 [SHOW INDEXES](../../50-administration-cmds/show-indexes.md) 命令:
70+
71+
```sql
72+
SHOW INDEXES;
73+
```
74+
75+
```sql
76+
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
77+
│ name │ type │ original │ definition │ created_on │ updated_on │
78+
├────────┼────────┼──────────┼──────────────────────────────────────────────────────────────────────┼────────────────────────────┼─────────────────────┤
79+
│ idx1 │ NGRAM │ │ amazon_reviews_ngram(review_body)bloom_size='2097152' gram_size='10'2025-05-13 01:22:34.123927NULL
80+
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
81+
```
82+
83+
或者,您可以先创建表,然后在 `review_body` 列上创建 Ngram 索引:
84+
85+
```sql
86+
CREATE TABLE amazon_reviews_ngram (
87+
review_date int(11) NULL,
88+
marketplace varchar(20) NULL,
89+
customer_id bigint(20) NULL,
90+
review_id varchar(40) NULL,
91+
product_id varchar(10) NULL,
92+
product_parent bigint(20) NULL,
93+
product_title varchar(500) NULL,
94+
product_category varchar(50) NULL,
95+
star_rating smallint(6) NULL,
96+
helpful_votes int(11) NULL,
97+
total_votes int(11) NULL,
98+
vine boolean NULL,
99+
verified_purchase boolean NULL,
100+
review_headline varchar(500) NULL,
101+
review_body string NULL
102+
);
103+
```
104+
105+
```sql
106+
CREATE NGRAM INDEX idx1
107+
ON amazon_reviews_ngram(review_body)
108+
gram_size = 10 bloom_size = 2097152;
109+
```
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
title: DROP NGRAM INDEX
3+
sidebar_position: 4
4+
---
5+
6+
import FunctionDescription from '@site/src/components/FunctionDescription';
7+
8+
<FunctionDescription description="Introduced or updated: v1.2.726"/>
9+
10+
import EEFeature from '@site/src/components/EEFeature';
11+
12+
<EEFeature featureName='NGRAM INDEX'/>
13+
14+
从表中删除现有的 NGRAM 索引。
15+
16+
## 语法
17+
18+
```sql
19+
DROP NGRAM INDEX [IF EXISTS] <index_name>
20+
ON [<database>.]<table_name>;
21+
```
22+
23+
## 示例
24+
25+
以下示例从 `amazon_reviews_ngram` 表中删除 `idx1` 索引:
26+
27+
```sql
28+
DROP NGRAM INDEX idx1 ON amazon_reviews_ngram;
29+
```
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
title: NGRAM INDEX
3+
---
4+
import IndexOverviewList from '@site/src/components/IndexOverviewList';
5+
import EEFeature from '@site/src/components/EEFeature';
6+
7+
<EEFeature featureName='NGRAM INDEX'/>
8+
9+
本页提供了 Databend 中 Ngram 索引相关命令的参考信息。
10+
11+
<IndexOverviewList />
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
title: SHOW INDEXES
3+
sidebar_position: 3
4+
---
5+
import FunctionDescription from '@site/src/components/FunctionDescription';
6+
7+
<FunctionDescription description="Introduced or updated: v1.2.190"/>
8+
9+
显示已创建的索引。等效于 `SELECT * FROM system.indexes`
10+
11+
另请参阅:[system.indexes](../../00-sql-reference/31-system-tables/system-indexes.md)
12+
13+
## 语法
14+
15+
```sql
16+
SHOW INDEXES [LIKE '<pattern>' | WHERE <expr>] | [LIMIT <limit>]
17+
```
18+
19+
## 示例
20+
21+
```sql
22+
CREATE TABLE t1(a int,b int);
23+
24+
CREATE AGGREGATING INDEX agg_idx AS SELECT avg(a), abs(sum(b)), abs(b) AS bs FROM t1 GROUP BY bs;
25+
26+
SHOW INDEXES;
27+
28+
29+
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
30+
│ name │ type │ original │ definition │ created_on │ updated_on │
31+
├─────────┼─────────────┼──────────────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────┼─────────────────────┤
32+
│ agg_idx │ AGGREGATING │ SELECT avg(a), abs(sum(b)), abs(b) AS bs FROM default.t1 GROUP BY bs │ SELECT abs(b) AS bs, COUNT(), COUNT(a), SUM(a), SUM(b) FROM default.t1 GROUP BY bs │ 2024-01-29 07:15:34.856234NULL
33+
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
34+
```

0 commit comments

Comments
 (0)