阅读ngram parser文档
This commit is contained in:
@@ -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`
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user