在本文中,无涯教程将学习使用支持的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;
将获得以下结果:
在前面的示例中,无涯教程可以看到默认情况下,ngram中的令牌大小(n)为2.如果要更改默认令牌大小,需要使用 ngram_token_size 配置选项值为1和10之间的价值范围。值得注于较小的令牌大小进行更小的全文搜索索引,并提供快速搜索。
ngram_token_size是一个只读变量,因此只能使用以下两个选项设置其值:
1.在启动字符串中:
mysqld --ngram_token_size=1
2.在配置文件中:
[mysqld] ngram_token_size=1
在解析时,在ngram解析器中消除了空间。例如:
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 ('??');
这是结果:
在这里,将使用以下模式处理搜索结果:
自然语言搜索模式将搜索项转换为Ngram值的联轴。 例如,如果令牌大小为2,则搜索项"mysql"可以转换为的ys sq和ql。请参阅以下声明:
mysql> SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('?????' IN NATURAL LANGUAGE MODE);
将获得所需的结果:
链接:https://www.learnfk.comhttps://www.learnfk.com/mysql/mysql-ngram-full-text-parser.html
来源:LearnFk无涯教程网
布尔搜索模式将搜索项转换为Ngram短语搜索。请参阅以下声明:
mysql> SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('?????' IN BOOLEAN MODE);
将获得所需的结果:
链接:https://www.learnfk.comhttps://www.learnfk.com/mysql/mysql-ngram-full-text-parser.html
来源:LearnFk无涯教程网
当使用通配符以搜索ngram解析器时,它可能会返回意外结果。因为ngram fulltext索引仅包含ngrams,所以这就是为什么它不知道术语的开头。
以下规则用于使用NAM全文索引使用通配符进行搜索:
1.如果ngram令牌大小在通配符中的前缀术语长时间,则查询返回包含以前缀术语开始的Ngram令牌的所有文档。例如:
mysql> SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('my*');
将获得以下结果:
2.如果ngram令牌大小短于通配符中的前缀项,则MySQL将前缀术语转换为ngram短语,并且忽略通配符运算符。例如
mysql> SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('mysql');
无涯教程将获得以下结果,术语"mysql"被转换为ngram短语:"My""ys""sq""ql"。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)