MySQL 的 ngram 全文解析器

        MySQL 内置的全文解析器使用单词之间的空格作为分隔符,这对于不使用空格做分隔符的语言是一种限制。为了解决这一限制,MySQL提供了一个支持中文、日文和韩文(CJK)的ngram全文解析器。ngram 全文解析器支持InnoDB和MyISAM的全文索引 。

ngram解析器将文本序列分词为连续的n个字符。例如,你可以使用ngram全文解析器为“abcd”进行不同值的n分词。

n=1: 'a', 'b', 'c', 'd'
n=2: 'ab', 'bc', 'cd'
n=3: 'abc', 'bcd'
n=4: 'abcd'

ngram 全文解析器是一个内置的服务器插件。与其他内置服务器插件一样,它会在服务器启动时自动加载。

配置 ngram_token_size

ngram_token_size 默认值为2,最小值为1,最大值为10。

例如,ngram_token_size 为2时,ngram解析器将字符串“abc def”解析为四个tokens:“ab”, “bc”, “de” 和 “ef”。

一般建议将ngram_token_size设置为你想要搜索的最大词的大小。如果你只打算搜索单个字符,可以将ngram_token_size设置为1。较小的字符长度将产生较小的全文搜索索引,并且搜索速度更快。例如,“Happy Birthday”用简体中文是“生日快乐”,其中“生日”是“birthday”,“快乐”意为“happy”。若要搜索像这样的两个字符的词,可以将ngram_token_size设置为2或更高的值。

ngram_token_size是一个只读变量,只能启动字符串时设置或在配置文件中设置:

启动字符串:

mysqld --ngram_token_size=2

配置文件:

[mysqld]
ngram_token_size=2

 创建使用 ngram 解析器的 FULLTEXT 索引

以下示例演示了创建一个带有ngram FULLTEXT索引的表,插入样本数据(简体中文文本),并在Information Schema INNODB_FT_INDEX_CACHE表中查看分词后的数据。

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;

要向现有表添加FULLTEXT索引,可以使用ALTER TABLE或CREATE INDEX。例如:

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解析器特殊处理方式

空格处理

ngram解析器在解析过程中忽略了单词间的空白,因此“ab cd”和“a bc”都会相应地被解析为"ab", "cd"和"bc"。

停止词处理

与内置全文解析器不同,ngram解析器会排除包含停止词的tokens。默认情况下,ngram解析器采用英语停止词列表,但您可以创建适合中文、日文或韩文的停止词列表。

通配符搜索

由于 ngram FULLTEXT 索引仅包含 ngram,并且不包含有关术语开头的信息,因此通配符搜索可能会返回意外结果。以下行为适用于使用 ngram FULLTEXT 搜索索引的通配符搜索:

  • 如果通配符搜索的前缀术语短于 ngram 标记大小,则查询将返回包含以前缀术语开头的 ngram 标记的所有索引行。例如,假设 ngram_token_size=2 ,搜索“a*”将返回以“a”开头的所有行。

  • 如果通配符搜索的前缀术语长于 ngram 令牌大小,则前缀术语将转换为 ngram 短语,并忽略通配符运算符。例如,假设 ngram_token_size=2 ,“abc*” 通配符搜索转换为 “ab bc”。

  • 30
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在过去几个世纪的话流行的变化 版本1.1中的新增功能:*现在您可以通过用逗号分隔短语来比较短语*可以将开始年份设置为1500或1800 *删除了不必要的权限*更好的代码隐藏在我的眼里,我不敢相信类似的东西已经被制造出来了。 甚至不是Google(数据的所有者)。 因此,我将其作为个人用途使用; 认为其他人可能会觉得有用,所以我分享了它。 我们非常欢迎您通过建议代码,发送反馈等方式做出贡献。此工具不需要任何特殊权限或类似的权限。 该扩展程序不会从您那里收集任何数据。 自由使用。 该代码不可能比这更简单。 该工具的作用只是将您连接到“ Google Ngram Viewer”,该工具可查看给定单词的使用在过去如何增加或减少。 作为以英语为第二语言的人,我使用Ngrams的个人目的一直是检查我正在学习的新单词。 有时,单词很快就会过时; 在这种情况下,为了更好地选择单词,最好使用同义词。 该工具的快捷键是Alt + N。 打开它时,键入单词(您也可以键入单词组合和名称),然后按Enter。 ****************************************************** *********引用Google Ngram Viewer的常见问题解答:“我正在根据您的结果撰写论文。我如何引用您的工作?如果您要将这些数据用于学术出版物,请引用原始论文:Jean-Baptiste Michel *,Yuan Kui Shen,Aviva Presser Aiden,Adrian Veres,Matthew K.Gray,William Brockman,Google图书团队,Joseph P.Pickett,Dale Hoiberg,Dan Clancy,Peter Norvig,Jon Orwant,Steven Pinker,Martin A. Nowak和Erez Lieberman Aiden *。使用数百万本数字化图书对文化进行的定量分析。科学(在线印刷,出版时间:2010年12月16日) -语音标记:Yuri Lin,Jean-Baptiste Michel,Erez Lieberman Aiden,Jon Orwant,William Brockman,Slav Petrov。Google图书Ngram语料库的句法注释。计算语言学协会第50届年会论文集第2卷:演示我要发表的论文(ACL '12)(2012) 我的书/杂志/博客/演示文稿中的Ngram图。 您的许可条款是什么? Ngram Viewer图形和数据可以自由地用于任何目的,尽管感谢Google Books Ngram Viewer作为源,并包含指向http://books.google.com/ngrams的链接。” ****************************************************** ********* Copyleft 2014-15。所有错误均保留给开发人员:) 支持语言:English
### 回答1: To perform a MySQL ngram join tables fulltext search, you can follow these steps: 1. Enable ngram fulltext search in your MySQL server: You can enable ngram fulltext search by adding the following line to your MySQL configuration file (e.g., `/etc/my.cnf` or `/etc/mysql/my.cnf`): ``` [mysqld] innodb_ft_server_stopword_table= '' innodb_ft_enable_stopword=0 innodb_ft_min_token_size=2 innodb_ft_enable_keys=1 innodb_ft_ngram_token_size=3 ``` The above configuration enables ngram tokenization and indexing for fulltext searches in your MySQL server. 2. Create and populate the tables: Create the tables you want to join and add a fulltext index to each table using the ngram tokenization technique. For example, if you have two tables, `table1` and `table2`, you can create and populate them as follows: ``` CREATE TABLE table1 ( id INT(11) NOT NULL AUTO_INCREMENT, text TEXT, FULLTEXT INDEX (text) ) ENGINE=InnoDB; CREATE TABLE table2 ( id INT(11) NOT NULL AUTO_INCREMENT, text TEXT, FULLTEXT INDEX (text) ) ENGINE=InnoDB; INSERT INTO table1 (text) VALUES ('The quick brown fox'); INSERT INTO table1 (text) VALUES ('jumps over the lazy dog'); INSERT INTO table2 (text) VALUES ('The quick brown fox'); INSERT INTO table2 (text) VALUES ('jumps over the lazy dog'); ``` 3. Join the tables: To perform a fulltext search using the ngram technique, you can join the tables on their fulltext index columns. For example, if you want to find all the records that contain the word "brown" in both `table1` and `table2`, you can use the following query: ``` SELECT table1.*, table2.* FROM table1 JOIN table2 ON MATCH(table1.text) AGAINST('brown' IN NATURAL LANGUAGE MODE) AND MATCH(table2.text) AGAINST('brown' IN NATURAL LANGUAGE MODE) ``` This query joins `table1` and `table2` on their fulltext index columns and performs a fulltext search for the word "brown" using the ngram technique. Note: Keep in mind that ngram fulltext search can be resource-intensive, especially if you have a large amount of data. You may need to optimize your MySQL server or adjust the ngram tokenization parameters to improve performance. ### 回答2: 要实现MySQLNgram连接表全文搜索,你可以按照以下步骤操作: 1. 确保你的MySQL版本支持Ngram全文索引。Ngram索引是一种特殊的全文索引,可以在词组级别上进行索引和匹配。从MySQL 5.7版本开始,Ngram索引被引入并成为MySQL的一部分。 2. 在需要进行全文搜索的表中添加Ngram索引。你需要将需要搜索的文本字段定义为Ngram类型,并为该字段创建Ngram索引。例如,假设你的表名为"table_name",字段名为"textfield_name",你可以使用以下命令创建Ngram索引: ALTER TABLE table_name ADD FULLTEXT INDEX idx_ngram_textfield_name (textfield_name) WITH PARSER NGRAM; 3. 要进行Ngram连接表全文搜索,你需要使用JOIN语句将两个表连接起来,并使用MATCH AGAINST条件进行全文搜索。例如,假设你有两个表名为"table1"和"table2",它们之间通过字段"field1"和"field2"进行连接,你可以使用以下语句进行全文搜索: SELECT table1.* FROM table1 INNER JOIN table2 ON MATCH (table1.field1) AGAINST (table2.field2 IN NATURAL LANGUAGE MODE); 注意,这里的关键是使用MATCH AGAINST条件进行全文搜索,并设置适当的匹配模式。你可以根据需要选择不同的匹配模式,如BOOLEAN模式、NATURAL LANGUAGE MODE等。 4. 执行以上查询语句后,MySQL将根据Ngram索引的内容从两个表中进行匹配,并返回与搜索条件匹配的结果。 需要注意的是,Ngram全文搜索可能在大型数据集上性能不佳,因为它需要对每个词组进行索引和匹配。在使用Ngram全文搜索时,你应该考虑数据库性能,并根据实际情况进行性能优化和调整。 ### 回答3: 要实现MySQL ngram联接表的全文搜索,需要按照以下步骤进行: 1. 安装MySQL插件:首先,需要安装MySQL插件,以支持ngram搜索功能。在安装过程中,需要注意将插件正确地配置和加载到MySQL中。 2. 创建表:根据需要创建要进行联接的表。确保每个表都具有适当的字段定义,并使用适当的字段类型,例如varchar或text。 3. 添加索引:为了实现快速全文搜索,需要在每个表的相关字段上添加适当的全文搜索索引。对于ngram搜索,可以使用FULLTEXT索引类型。 4. 创建联接查询:编写SQL查询语句,以使用ngram联接表和全文搜索功能。联接查询应该使用JOIN操作符来连接相关表,并在WHERE子句中使用MATCH AGAINST语句来进行全文搜索。 5. 配置ngram参数:通过设置MySQLngram参数,可以调整ngram搜索的行为。例如,可以设置ngram的最小和最大字词长度,以及最小的重要性阈值。 6. 测试查询:运行查询语句并测试数据库的响应时间和返回结果的准确性。根据需要,对查询进行调整和优化,以获得更好的性能和结果。 总结起来,要实现MySQL ngram联接表的全文搜索,需要安装插件、创建表、添加索引、编写联接查询、配置ngram参数,并进行测试和优化。这些步骤将帮助您有效地实现所需的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值