MySql 全文检索

一、概述

全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。

引擎支持:全文索引在MySql中很早就已支持,不过5.6以前只有 MyISAM 引擎支持,5.6以后 InnoDB 也开始支持全文检索。不过一直以来默认的全文索引 parser 只适合于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符,一个词可以由多个字来组成就显得不合适。
但从MySql 5.7开始,内置了n-gram全文索引插件开始支持中文。

二、可选参数

若使用 ngram 索引插件,则可在MySql配置文件 my.ini 中设置分词大小(默认为2)

分词的 Size 越小,索引的体积就越大,所以要根据具体情况来设置合适的大小
如:

	[mysqlId]
	ngram_token_size=2

含义:
  例如:"信息系统"在设置为不同值时的分词情况
    ngram_token_size=1 信,息,系,统
    ngram_token_size=2 信息,息系,系统
    ngram_token_size=3 信息系,息系统
    ngram_token_size=4 信息系统

三、使用流程

1. 建立全文索引

建立索引字段:
  根据需求确定,哪些字段需要单独检索或是联合检索就建立哪些字段。
  如:title,content 需要一起检索,那就建立联合索引;需要分别单独检索,就单独建立索引
注:该索引可用于char、varchar、text字段

建立方式:
  建表时添加:
FULLTEXT (title,content) WITH PARSER ngram

  或者之后再添加:

create FULLTEXT index `fullIndex` on article(title,content) with parser ngram;ALTER TABLE article ADD FULLTEXT INDEX ngram_idx(ti
tle,content) WITH PARSER ngram;

2. 查询语法

select * from article where match(col1,col2…) against(‘keywords’ [search_modifier]);
解释:

  • col1,col2:需要被查询的列
  • ‘keywords’:搜索内容
  • [search_modifer]:可选,搜索模式

例:
select * from article where match(title, content) against ('安卓分类');

3. 检索方式详解

1. in natural language mode(自然语言模式)

在该模式下,查询将被转换为n-gram分词查询的并集,如:(‘分类安卓’)转换为(‘分类 类安 安卓’)
未指定模式时,默认为该模式
例:

2. IN BOOLEAN MODE(布尔模式)

该模式,可以为检索的字符串增加操作符,且不会像自然语言一样自动拆词查询并集(除非手动空格隔开)
如:
  表示搜索结果必须带有"安卓"和"分类"两词的结果

注:(未验证)有其他资料讲该模式还能解除50%限制(若一个关键词在50%数据出现,那么该词会被当做无效词)

操作符搜索规则:

  • 不加操作符:表示该词是可选的,含有该词相关性将更高(如 against(‘安卓 分类’) in boolean mode)
  • + :一定要有该关键词(不含有的数据条目将忽略)
  • - :不可以有该关键词(排除指定关键词,含有该词的条目将忽略)
  • > :提高该词的权重(影响结果排序)
  • < :降低该词的权重
  • ~ :将该关键词权重由正转负(含有该词的条目,将降低权重排在后面)
  • * :关键字后面,表示通配符
  • “” :双引号括起来表示为一个短句(可用来解决空格短句问题,如 against(’“安卓 分类”’ in boolean mode),此处"安卓 分类"是一个不可拆分的短句,而不是搜索含有安卓或分类两词的结果)
3. WITH QUERY EXPANSION(查询扩展模式)

当查询需要获取implied knowledge(隐含知识)时则使用该模式
比如:对于单词 database 的查询,用户可能希望查询的不仅仅是包含 database 的文档,还指那些包含mysql、oracle、db2的单词(前提是包含 database 的文档中出现过 mysql、oracle等词)

原理:会先根据给定关键字先进行自然语言查询(该次查询的结果权重最高的),再根据查询到的条目中所包含的其他词再进行一次查询
例:

分析:该模式下,会用"哈皮狗"用自然语言模式进行第一次查询,所以会将(“哈皮狗”)分成(“哈皮”)(“皮狗”)两个分词,含有的就将会被查到。因此能查到标题为"一篇哈皮作文"的条目,然后在该条目中,因为又包含了"一篇"这个词,所以可以查出后面那些包含了"一篇"的结果

常见问题 Tip:

  1. 结果的相关性排序由高到低
  2. 在对表创建索引时,Workbeanch 至少6.3及以前的版本都不支持 with parse 这种写法。可以执行,但建立索引后将无法再在可视化界面修改表,会报 DDL 错误

部分参考,或许也存在我不认同的地方,仅做标明:
nparse插件官方文档 https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html
https://www.cnblogs.com/lgms2008/p/7196525.html
https://www.sunzhongwei.com/mysql-full-text-retrieval-scheme-fulltext-indexing
https://www.cnblogs.com/martinzhang/p/3220345.html
https://www.cnblogs.com/zhoujinyi/p/5643408.html
https://www.sunzhongwei.com/mysql-full-text-retrieval-scheme-fulltext-indexing
https://www.jianshu.com/p/645402711dac
https://blog.youkuaiyun.com/qq_33663251/article/details/69612619

### MySQL全文检索功能的使用与示例 MySQL全文检索(Full-Text Search)是一种强大的功能,允许用户在文本数据中执行复杂的搜索操作。以下是关于其用法和示例的详细说明。 #### 1. 全文索引的创建 为了使用全文检索功能,首先需要在目标表上创建全文索引。以下是一个创建全文索引的示例: ```sql CREATE FULLTEXT INDEX idx_fulltext ON articles(content); ``` 此命令将在名为`articles`的表中的`content`列上创建一个全文索引[^1]。 #### 2. 基本查询语法 全文检索支持多种查询方式,包括自然语言模式、布尔模式以及查询扩展模式。下面分别介绍这些模式的使用方法。 - **自然语言模式**:这是最简单的全文检索模式,适用于大多数场景。 ```sql SELECT * FROM articles WHERE MATCH(content) AGAINST('database'); ``` 上述查询将返回`content`列中包含“database”一词的所有记录[^2]。 - **布尔模式**:布尔模式提供了更灵活的查询选项,例如可以指定必须包含或排除某些关词。 ```sql SELECT * FROM articles WHERE MATCH(content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE); ``` 此查询将返回`content`列中包含“MySQL”但不包含“Oracle”的所有记录[^3]。 - **查询扩展模式**:查询扩展模式会根据初始查询结果自动扩展搜索范围。 ```sql SELECT * FROM articles WHERE MATCH(content) AGAINST('database' WITH QUERY EXPANSION); ``` #### 3. 注意事项 - 全文索引仅支持MyISAM存储引擎或InnoDB存储引擎(从MySQL 5.6版本开始支持)。 - 最小和最大单词长度可以通过配置文件中的`ft_min_word_len`和`ft_max_word_len`参数进行调整[^4]。 #### 4. 示例代码 以下是一个完整的示例,展示如何在实际应用中使用全文检索功能。 ```sql -- 创建测试表 CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT (content) ) ENGINE=InnoDB; -- 插入测试数据 INSERT INTO articles (title, content) VALUES ('MySQL Tutorial', 'DBMS stands for DataBase ...'), ('How To Use Linux', 'Linux is a family of free & open-source...'); -- 执行全文检索 SELECT * FROM articles WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE); ``` #### 5. 性能优化建议 为了提高全文检索的性能,可以参考以下最佳实践: - 确保索引列的数据量足够大以充分利用全文索引。 - 定期优化表结构以减少碎片化。 - 避免对频繁更新的列创建全文索引[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值