阅读ngram parser文档

This commit is contained in:
asahi
2025-02-24 12:45:25 +08:00
parent 6aca9f0a96
commit d2d901b37c

View File

@@ -73,6 +73,10 @@
- [no operator](#no-operator)
- [Proximity Search](#proximity-search)
- [query expansion](#query-expansion)
- [ngram full-text parser](#ngram-full-text-parser)
- [配置`ngram_token_size`](#配置ngram_token_size)
- [使用ngram parser创建fulltext Index](#使用ngram-parser创建fulltext-index)
- [ngram parser space handling](#ngram-parser-space-handling)
# innodb索引与算法
@@ -862,6 +866,70 @@ innodb支持全文检索的拓展查询。有时用户的查询关键词太短
由于query expansion全文检索可能带来非常多的非相关性查询结果因此在使用时用户应该相当小心。
### ngram full-text parser
mysql中内置的full-text parser使用空格作为word之间的分隔符对部分语言如`中文,日文`并不适用。为了解决该限制mysql提供了`ngram`full-text parser其支持中文、日语、汉语。
> ngram full-text parser支持innodb和myisam存储引擎。
`ngram`代表给定文本中`n`个字符的连续序列,`ngram parser`会将一个文本`tokenize`为一系列连续的`n characters`序列。
> 例如,根据不同的`n`通过gram parser可以将字符串`abcd` tokenize为如下结果
> ```
> n=1 'a' 'b' 'c' 'd'
> n=2 'ab' bc' 'cd'
> n=3 abc' 'bcd'
> n=4 'abcd'
> ```
ngram parser是内置的server plugin其会在server启动时自动加载。
#### 配置`ngram_token_size`
ngram parser默认的ngram token size1为2例如当ngram token size为2时ngram parser将字符串`“abc def”`转化为4个token`"ab bc de ef"`
`ngram_token_size`参数可用于配置ngram token size。其最小值为1最大值为10.
通常ngram token size被设置为想要查找的最长token长度当ngram token size越小时将会产生更小的full-text search index查询也会变得更快。
#### 使用ngram parser创建fulltext Index
如下示例显示了如何创建ngram parser对应的full-text index
```sql
mysql> USE test;
mysql> CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;
mysql> SET NAMES utf8mb4;
INSERT INTO articles (title,body) VALUES
('数据库管理','在本教程中我将向你展示如何管理数据库'),
('数据库应用开发','学习开发数据库应用程序');
mysql> SET GLOBAL innodb_ft_aux_table="test/articles";
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;
```
如果要向已经存在的表中添加`full-text index`且使用ngram parser示例如下
```sql
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT
) ENGINE=InnoDB CHARACTER SET utf8mb4;
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;
# Or:
CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
```
#### ngram parser space handling
ngram parser在处理时消除空格示例如下
- `ab cd`会被转化为`ab``cd`
- `a bc`会被转化为`bc`