无涯教程-MySQL - ngram 全文解析器

38 阅读4分钟

在本文中,无涯教程将学习使用支持的mysql ngram全文解析器,支持出色语言的全文搜索,如日语,中文和韩语。

MYSQL提供ngram全文解析器以克服此问题。 MySQL 版本5 后,MySQL将Ngram全文解析器提供为内置服务器插件。类似于其他内置插件,MySQL在启动数据库服务器时会自动加载此插件。 InnodB和Myisam存储引擎支持Ngram全文解析器。

根据其在MySQL中的定义,ngram是来自给定文本序列的多个字符的连续序列。 例如,通过使用ngram全文解析器,可以为 n 的不同值授予字符串" java ",如下所示:

N = 1: j, a, v, a
N = 2: ja, av, va
N = 3: jav, ava
N = 4: java

创建全文索引

可以通过在Create表中使用Parser ngram在Create表,Alter Table或Create Index语句中指定带解析器来创建FullText索引。

请考虑以下示例,该示例创建名为“articles”的表,并使用ngram全文解析器添加title和body列。

mysql> CREATE TABLE articles (
      id INT AUTO_INCREMENT PRIMARY KEY,
      title VARCHAR(150),
      body TEXT,
      FULLTEXT (title, body) WITH PARSER ngram
    ) ENGINE=INNODB CHARACTER SET UTF8MB4;

接下来,将使用 set name 语句,将字符设置为 utf8mb4 ,如下所示:

mysql> SET NAMES UTF8MB4; 

接下来,将示例数据(简体中文文本)插入此表如下:

mysql> INSERT INTO articles (title, body) VALUES
    (?????, ??????????????????),
    (???????, ???????????);

最后,将使用以下声明来了解ngram如何授予数据:

mysql> SET GLOBAL innodb_ft_aux_table = "employeedb/articles";

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;

将获得以下结果:

MySQL ngram Full-Text Parser

设置令牌大小

在前面的示例中,无涯教程可以看到默认情况下,ngram中的令牌大小(n)为2.如果要更改默认令牌大小,需要使用 ngram_token_size 配置选项值为1和10之间的价值范围。值得注于较小的令牌大小进行更小的全文搜索索引,并提供快速搜索。

ngram_token_size是一个只读变量,因此只能使用以下两个选项设置其值:

1.在启动字符串中:

mysqld --ngram_token_size=1

2.在配置文件中:

[mysqld]
ngram_token_size=1

处理空间

在解析时,在ngram解析器中消除了空间。例如:

  • "ab cd"被解析为"ab","cd"
  • "a bc"被解析为"bc"

短语搜索

MySQL将短语搜索转换为Ngram短语搜索。例如,有一个短语搜索"abc",它被转换为"ab bc",返回包含"abc"和"ab bc"的结果。

如果有一个搜索短语"abc def",它被转换为"ab bc de ef",它会返回包含"abc def"和"ab bc de ef"的结果。它不会返回包含"ABCDEF"的文档。

以下语句显示搜索此短语??在articles文章表中:

SELECT id, title, body
FROM articles
WHERE MATCH (title, body) AGAINST (??);

这是结果:

MySQL ngram Full-Text Parser

处理不同搜索模式

在这里,将使用以下模式处理搜索结果:

自然语言模式

自然语言搜索模式将搜索项转换为Ngram值的联轴。 例如,如果令牌大小为2,则搜索项"mysql"可以转换为的ys sq和ql。请参阅以下声明:

mysql> SELECT * FROM articles 
WHERE MATCH (title, body) 
AGAINST (????? IN NATURAL LANGUAGE MODE);

将获得所需的结果:

MySQL ngram Full-Text Parser

布尔模式

布尔搜索模式将搜索项转换为Ngram短语搜索。请参阅以下声明:

mysql> SELECT * FROM articles 
WHERE MATCH (title, body) 
AGAINST (????? IN BOOLEAN MODE);

将获得所需的结果:

MySQL ngram Full-Text Parser

通配符搜索

当使用通配符以搜索ngram解析器时,它可能会返回意外结果。因为ngram fulltext索引仅包含ngrams,所以这就是为什么它不知道术语的开头。

以下规则用于使用NAM全文索引使用通配符进行搜索:

1.如果ngram令牌大小在通配符中的前缀术语长时间,则查询返回包含以前缀术语开始的Ngram令牌的所有文档。例如:

mysql> SELECT * FROM articles
WHERE MATCH (title, body) AGAINST (my*);

将获得以下结果:

MySQL ngram Full-Text Parser

2.如果ngram令牌大小短于通配符中的前缀项,则MySQL将前缀术语转换为ngram短语,并且忽略通配符运算符。例如

mysql> SELECT * FROM articles
WHERE MATCH (title, body) AGAINST (mysql);

无涯教程将获得以下结果,术语"mysql"被转换为ngram短语:"My""ys""sq""ql"。

MySQL ngram Full-Text Parser

参考链接

www.learnfk.com/mysql/mysql…