Mysql实现全文检索、关键词跑分的方法实例

 更新时间:2020年09月03日 10:54:14   作者:云道小破栈  
这篇文章主要给大家介绍了关于Mysql实现全文检索、关键词跑分的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、前言

今天一个同事问我,如何使用 Mysql 实现类似于 ElasticSearch 的全文检索功能,并且对检索关键词跑分?我当时脑子里立马产生了疑问?为啥不直接用es呢?简单好用还贼快。但是听他说,数据量不多,客户给的时间非常有限,根本没时间去搭建es,所以还是看一下 Mysql 的全文检索功能吧!

MySQL 从 5.7.6 版本开始,MySQL就内置了ngram全文解析器,用来支持中文、日文、韩文分词。在 MySQL 5.7.6 版本之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。本篇文章测试的时候,采用的 Mysql 5.7.6 ,InnoDB数据库引擎。mysql全文检索

二、全文解析器ngram

ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。
例如,用ngram全文解析器对“你好世界”进行分词:

n=1: '你', '好', '世', '界' 
n=2: '你好', '好世', '世界' 
n=3: '你好世', '好世界' 
n=4: '你好世界'

MySQL 中使用全局变量 ngram_token_size 来配置 ngram 中 n 的大小,它的取值范围是1到10,默认值是 2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为 1。在默认值是 2 的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值 2。

咱们看一下Mysql默认的ngram_token_size大小:

show variables like 'ngram_token_size'

ngram_token_size 变量的两种设置方式:

1、启动mysqld命令时指定

mysqld --ngram_token_size=2

2、修改mysql配置文件

[mysqld] 
ngram_token_size=2

三、全文索引

以某文书数据为例,新建数据表 t_wenshu ,并且针对文书内容字段创建全文索引,导入10w条测试数据。

1、建表时创建全文索引

CREATE TABLE `t_wenshu` (
 `province` varchar(255) DEFAULT NULL,
 `caseclass` varchar(255) DEFAULT NULL,
 `casenumber` varchar(255) DEFAULT NULL,
 `caseid` varchar(255) DEFAULT NULL,
 `types` varchar(255) DEFAULT NULL,
 `title` varchar(255) DEFAULT NULL,
 `content` longtext,
 `updatetime` varchar(255) DEFAULT NULL,
 FULLTEXT KEY `content` (`content`) WITH PARSER `ngram`
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、通过 alter table 方式

ALTER TABLE t_wenshu ADD FULLTEXT INDEX content_index (content) WITH PARSER ngram;

3、通过 create index 方式

CREATE FULLTEXT INDEX content_index ON t_wenshu (content) WITH PARSER ngram;

四、检索模式

自然语言检索

(IN NATURAL LANGUAGE MODE)自然语言模式是 MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

布尔检索

(IN BOOLEAN MODE)剔除一半匹配行以上都有的词,例如,每行都有this这个词的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);布尔检索模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

   ● IN BOOLEAN MODE的特色:
      ·不剔除50%以上符合的row。
      ·不自动以相关性反向排序。
      ·可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。
      ·限制最长与最短的字符串。
      ·套用Stopwords。

   ● 搜索语法规则:
     +   一定要有(不含有该关键词的数据条均被忽略)。
     -   不可以有(排除指定关键词,含有该关键词的均被忽略)。
     >   提高该条匹配数据的权重值。
     <   降低该条匹配数据的权重值。
     ~   将其相关性由正转负,表示拥有该字会降低相关性(但不像-将之排除),只是排在较后面权重值降低。
     *   万用字,不像其他语法放在前面,这个要接在字符串后面。
     " " 用双引号将一段句子包起来表示要完全相符,不可拆字。

查询扩展检索

注释:(WITH QUERY EXPANSION)由于查询扩展可能带来许多非相关性的查询,谨慎使用!

五、检索查询

1)查询 content 中包含“盗窃罪”的记录,查询语句如下

select caseid,content, MATCH ( content) AGAINST ('盗窃罪') as score from t_wenshu where MATCH ( content) AGAINST ('盗窃罪' IN NATURAL LANGUAGE MODE)

2)查询 content 中包含“寻衅滋事”的记录,查询语句如下

select caseid,content, MATCH ( content) AGAINST ('寻衅滋事') as score from t_wenshu where MATCH ( content) AGAINST ('寻衅滋事' IN NATURAL LANGUAGE MODE) ;

3)单个汉字,查询 content 中包含“我”的记录,查询语句如下

select caseid,content, MATCH ( content) AGAINST ('我') as score from t_wenshu where MATCH ( content) AGAINST ('我' IN NATURAL LANGUAGE MODE) ;

备注:因为设置的全局变量 ngram_token_size 的值为 2。如果想查询单个汉字,需要在配置文件 my.ini 中修改 ngram_token_size = 1 ,并重启 mysqld 服务,此处不做尝试了。

4)查询字段 content 中包含 “危险驾驶”和“寻衅滋事”的语句如下:

select caseid,content, MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事' IN BOOLEAN MODE);

5)查询字段 content 中包含 “危险驾驶”,但不包含“寻衅滋事”的语句如下:

select caseid,content, MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事' IN BOOLEAN MODE);

6)查询字段 conent 中包含“危险驾驶”或者“寻衅滋事”的语句如下:

select caseid,content, MATCH (content) AGAINST ('危险驾驶 寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('危险驾驶 寻衅滋事' IN BOOLEAN MODE);

六、总结

1)使用 Mysql 全文索引之前,搞清楚各版本支持情况;

2)全文索引比 like + % 快 N 倍,但是可能存在精度问题;

3)如果需要全文索引的是大量数据,建议先添加数据,再创建索引;

4)对于中文,可以使用 MySQL 5.7.6 之后的版本,或者 Sphinx、Lucene 等第三方的插件;

5)MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致,且只能是同一个表的字段不能跨表;

到此这篇关于Mysql实现全文检索、关键词跑分的文章就介绍到这了,更多相关Mysql全文检索、关键词跑分内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • win11设置mysql开机自启的实现方法

    win11设置mysql开机自启的实现方法

    本文主要介绍了win11设置mysql开机自启的实现方法,要通过命令行方式设置,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • MySQL触发器的使用场景及方法实例

    MySQL触发器的使用场景及方法实例

    这篇文章主要给大家介绍了关于MySQL触发器的使用场景及方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 解决JDBC的class.forName()问题

    解决JDBC的class.forName()问题

    这篇文章主要介绍了关于JDBC的class.forName()问题,比较两个Java文件可见,连接Db2和连接MySQL的方式非常类似,唯一的区别在于,调用 DriverManager.getConnection() 方法时,传入的URL不同,本文给大家详细讲解,需要的朋友参考下
    2022-09-09
  • MySQL数据更新操作的两种办法(数据可视化工具和SQL语句)

    MySQL数据更新操作的两种办法(数据可视化工具和SQL语句)

    MySQL是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD,下面这篇文章主要给大家介绍了关于MySQL数据更新操作的两种办法,需要的朋友可以参考下
    2023-03-03
  • mysql格式化字符串长度不够补0问题

    mysql格式化字符串长度不够补0问题

    这篇文章主要介绍了mysql格式化字符串长度不够补0问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MySQL中MAX()和MIN()函数的高效使用及技巧

    MySQL中MAX()和MIN()函数的高效使用及技巧

    在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面这篇文章主要给大家介绍了关于MySQL中MAX()和MIN()函数的高效使用及技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Mysql存储过程学习笔记--建立简单的存储过程

    Mysql存储过程学习笔记--建立简单的存储过程

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
    2014-08-08
  • mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
    2011-05-05
  • web方式的mysql管理工具详解

    web方式的mysql管理工具详解

    这篇文章主要介绍了web方式的mysql管理工具,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Windows10下mysql 8.0.22 安装配置方法图文教程

    Windows10下mysql 8.0.22 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows10下mysql 8.0.22 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论