MySQL全文检索临时代替ES实现快速搜索

这篇具有很好参考价值的文章主要介绍了MySQL全文检索临时代替ES实现快速搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入

在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

全文索引只支持InnoDB和MyISAM引擎,支持的类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。

了解:什么是n-gram模型

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

MySQL分词配置

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。

全局变量ngram_token_size的两种设置方法:

  1. 启动mysqld命令时
mysqld --ngram_token_size=2
  1. 修改MySQL配置文件
[mysqld]

ngram_token_size=2
创建全文检索并分词
  1. 创建表的同时创建全文索引
CREATE TABLE `essay` (
  `essay_id` varchar(20) NOT NULL,
  `autoid` tinyint(20) NOT NULL COMMENT '序号',
  `essay_title` varchar(20) CHARACTER SET utf8 NOT NULL COMMENT '文章标题',
  `essay_details` varchar(255) NOT NULL COMMENT '文章内容',
  `essay_images` varchar(255) DEFAULT NULL COMMENT '文章图片地址',
  `user_id` varchar(20) NOT NULL COMMENT '用户id',
  `create_time` timestamp(6) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` timestamp(6) NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`essay_id`),
  UNIQUE KEY `idx_cs_id` (`essay_id`),
  FULLTEXT KEY `idx_cs_index` (`essay_title`) /*!50100 WITH PARSER `ngram` */ 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 通过 alter table 的方式来添加
ALTER TABLE essay ADD FULLTEXT INDEX idx_cs_index(essay_title) WITH PARSER ngram;
  1. 直接通过create index的方式
CREATE FULLTEXT INDEX idx_cs_index ON essay(essay_title) WITH PARSER ngram;
使用Navicat创建全文检索

MySQL全文检索临时代替ES实现快速搜索

SQL中使用全文检索

常用的全文检索模式有两种:

  1. 自然语言模式(NATURAL LANGUAGE MODE) ,
    自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
  2. BOOLEAN模式(BOOLEAN MODE)
    BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
-- 简单使用
select id,essay_title,essay_details from essay
where match(essay_title) against('全文检索' IN NATURAL LANGUAGE MODE)
order by create_time desc
limit 200,20

-- 不指定模式,默认使用自然语言模式
select id,essay_title,essay_details from essay
where match(essay_title) against('全文检索')
order by create_time desc
limit 200,20

-- 搜索框提示查询
select id,match(essay_title) against('全文检索' IN NATURAL LANGUAGE MODE) as title from essay
order by create_time desc
limit 200,20

-- 使用BOOLEAN模式执行高级查询 必须包含"Java"
SELECT * FROM essay WHERE MATCH (essay_title) against('+Java' IN BOOLEAN MODE);

-- 使用BOOLEAN模式执行高级查询 必须包含"Java",但是不能包含"汇编"
SELECT * FROM essay WHERE MATCH (essay_title) against('+Java -汇编' IN BOOLEAN MODE);
BOOLEAN模式下运算符的使用方式:
'apple banana' 
无操作符,表示或,要么包含apple,要么包含banana
 
'+apple +juice'
必须同时包含两个词
 
'+apple macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性会更高。
 
'+apple -macintosh'
必须包含apple,同时不能包含macintosh。
 
'+apple ~macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。
 
'+apple +(>juice <pie)'
查询必须包含apple和juice或者apple和pie的记录,但是apple juice的相关性要比apple pie高。
 
'apple*'
查询包含以apple开头的单词的记录,如apple、apples、applet。
 
'"some words"'
使用双引号把要搜素的词括起来,效果类似于like '%some words%',

只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。
全文索引只支持InnoDB和MyISAM引擎。
MATCH (columnName) AGAINST (‘keywords’)。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。
MATCH()函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索。
建议:如果要导入大数据集,数据初始化同步等需求时;建议先同步数据之后然后再创建全文索引,创建全文检索后导入很影响TPS的

全文检索与模糊查询效率对比

MySQL全文检索临时代替ES实现快速搜索
MySQL全文检索临时代替ES实现快速搜索
第一张图是模糊查询的结果,第二张图是全文检索的结果

执行器解释查看

MySQL全文检索临时代替ES实现快速搜索
MySQL全文检索临时代替ES实现快速搜索
可以看到最明显的区别,第一个没全文索引的语句最后的rows是2120,有全文检索的是1文章来源地址https://www.toymoban.com/news/detail-466718.html

explain解读

  1. type:ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
  2. possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
  3. key:表示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
  4. ref:表示选择 key 列上的索引,哪些列或常量被用于查找索引列上的值
  5. rows:根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
  6. Extra
    a.Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
    b.Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”

到了这里,关于MySQL全文检索临时代替ES实现快速搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql 实现类似于 ElasticSearch 的全文检索功能

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

    2024年02月03日
    浏览(32)
  • 【springboot微服务】Lucence实现Mysql全文检索

    目录 一、前言 1.1 常规调优手段 1.1.1 加索引 1.1.2 代码层优化 1.1.3 减少关联表查询

    2023年04月12日
    浏览(36)
  • MySQL高级特性篇(3)-全文检索的实现与优化

    MySQL数据库全文检索是指对数据库中的文本字段进行高效地搜索和匹配。在MySQL数据库中,可以使用全文检索来实现快速的文本搜索功能,并且可以通过一些优化手段提高全文检索的性能。 全文检索是一种将搜索与自然语言处理技术结合起来的搜索方法。与传统的基于

    2024年02月19日
    浏览(26)
  • ES(Elasticsearch 全文检索)

    数据量大的时候 索引失效 =查询性能低 功能比较弱 对文档的内容进行分词,对词条创建索引,记录词条所在的文档信息根据词条查询到文档的id 从而查到文档 文档:每一条数据就是一条文档 词条:文档按照语义分成的词语 正向索引 根据文档的id创建索引 查询词条必须先找

    2024年02月05日
    浏览(40)
  • 全文检索[ES系列] - 第495篇

    历史文章( 文章 累计490+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 Mybatis-Plus通用枚举功能 [MyBatis-Plus系列

    2024年02月04日
    浏览(35)
  • 双方案-基于Mysql 与 ElasticSearch实现关键词提示搜索与全文检索

    就喜欢搞这种不需要怎么费劲的东西,只需要把思路阐述清楚,随笔性质的博文,顺手啊,几乎不用改定就可以当博文发布出去。 那么,这里的话我们要做的就是实现这个的一个搜索功能,这个前端我就不说了,实现起来起来其实还是容易的,就是费劲。我们主要关注

    2024年01月18日
    浏览(48)
  • ES+微服务对文档进行全文检索

    打开ES服务 进入es安装目录下F:elasticsearch-7.17.1bin,双击elasticsearch.bat,如图 成功后,如图 2. 打开ES可视化服务 进入安装F:elasticsearch-head-master路径下,执行npm run start 3. 打开浏览器 参考文献:https://blog.csdn.net/mjl1125/article/details/121975950

    2024年02月11日
    浏览(32)
  • 商城-学习整理-高级-全文检索-ES(九)

    https://www.elastic.co/cn/what-is/elasticsearch Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 REST API:天然的跨平台。 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/cur

    2024年02月12日
    浏览(32)
  • 第八章 全文检索【上】+商品添加ES + 商品热度排名

    根据用户输入的检索条件,查询出对用的商品 首页的分类  搜索栏 1.3.1 建立mapping! 这时我们要思考三个问题: 哪些字段需要分词  例如:商品名称 我们用哪些字段进行过滤 平台属性值 分类Id 品牌Id 哪些字段我们需要通过搜索查询出来。 商品名称,价格,图片等。 以上分析

    2024年02月09日
    浏览(24)
  • 【ElasticSearch-基础篇】ES高级查询Query DSL全文检索

    和术语级别查询(Term-Level Queries)不同,全文检索查询(Full Text Queries)旨在 基于相关性搜索和匹配文本数据 。这些查询会对输入的文本进行分析,将其 拆分 为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。 全文检索的关键特点: 对输入的文本进行分析

    2024年01月22日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包