iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql全文索引
  • 932
分享到

Mysql全文索引

mysql数据库全文检索 2023-08-18 22:08:02 932人浏览 独家记忆
摘要

1.背景简介 项目开发过程有时候会遇到全文检索的需求,但是数据量有时候比较小,不属于高并发高吞吐场景,这种场景搭建ES服务有点浪费资源,也把工程设计复杂了,所以需要采用更简单更廉价的方案。一般业务系统都会用到Mysql或者postgresq

1.背景简介

项目开发过程有时候会遇到全文检索的需求,但是数据量有时候比较小,不属于高并发高吞吐场景,这种场景搭建ES服务有点浪费资源,也把工程设计复杂了,所以需要采用更简单更廉价的方案。一般业务系统都会用到Mysql或者postgresql服务,无论是mysql还是Postgresql都对full-text做了兼容,下面以最常见的mysql数据库服务为例,讲述mysql服务接入full-text索引的过程。

2.Mysql全文索引简介

mysql的全文索引主要用于全文字段的检索场景,支持char、varchar、text几个字段加全文索引,仅支持InNoDB与MyISAM引擎。
mysql内置了ngram解析器来支持中文、日文、韩文等语言的文本,全文索引支持通过建表语句来创建或者建表后新增。
mysql全文索引支持三种模式:
● 布尔模式(IN BOOLEAN MODE)
● 自然语言模式(NATURAL LANGUAGE MODE)
● 查询拓展(QUERY EXPANSioN)
参考:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html《Full-Text Search Functions》

3.ngram简介

ngram一种基于统计语言模型的算法,简单来说,就是通过一个大小为n的滑动窗口,将一段文本分成多个由n个连续单元组成的term。例:

n=2text=湖北省武汉市

经过ngram解析器解析后,得到如下分词:

湖北 北省 省武 武汉 汉市

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

参考:
https://zhuanlan.zhihu.com/p/32829048自然语言处理中N-Gram模型介绍》
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html《ngram Full-Text Parser》

4.数据库配置

先看mysql版本

ngram解析器是mysql5.7版本后,内置的全文索引解析器,所以要求mysql版本要5.7及以上。
查看mysql版本:

select version()

配置ngram

ngram可以作为启动字符串的一部分或者在配置文件中设置
启动字符串:

mysqld --ngram_token_size=2

配置文件(my.ini):
以windos系统为例,首先找到my.ini文件(默认安装路径:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini),编辑该文件,在文件后加上如下配置:

ngram_token_size=2

配置完成后重启服务

5.创建全文索引

通过建表语句创建

CREATE TABLE `news`  (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题',  PRIMARY KEY (`id`) USING BTREE,  FULLTEXT INDEX `idx_full_text`(`content`) WITH PARSER `ngram`) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

通过CREATE FULLTEXT INDEX语句创建

CREATE FULLTEXT INDEX idx_full_text ON news (content) WITH PARSER ngram;

6.使用全文索引

首先写入部分测试全文数据:

INSERT INTO `news` VALUES (1, '武汉市今天有小雨,大家出门记得带雨伞', '武汉天气');INSERT INTO `news` VALUES (2, '湖北省武汉市是中部最大的城市,华中地区第一大都市', '湖北省武汉市');INSERT INTO `news` VALUES (3, '武汉大学今年不开放樱花观赏,请各位游客不必前往', '武大樱花');INSERT INTO `news` VALUES (4, '湖北省是千湖之省,风景秀丽,欢迎全国各地游客', '湖北省旅游');INSERT INTO `news` VALUES (5, '武汉光谷是武汉市高新技术公司聚集地,大量来自全球各地的优秀人才聚集在此', '武汉光谷');

布尔模式

布尔模式的全文检索支持下面几种操作符:
● +(必须出现)
● -(必须不出现)
● 无操作符(出现了,相关性会更高)
● @distance(需要满足一定的编辑距离 仅仅支持InnoDB存储引擎)
● <>(增加或者减少相关性)
● ~(负相关性)
● *(通配符)
● “”(短语)

下面分别介绍这几种操作符在布尔模式下的用法:

select * from news where MATCH (content) against ('+武汉' in Boolean MODE);

查询结果:
在这里插入图片描述

+武汉表示必须出现’武汉’这个单词数据才能被检索到,从结果可以看出,'武汉’这个单词出现次数最多的排在最前面(参考第7章节)。

select * from news where MATCH (content) against ('+武汉 -雨伞' in Boolean MODE); 

在这里插入图片描述

+武汉表示被检索到的数据必须包含’武汉’这个分词,-雨伞表示被检索到的数据必须不能包含’雨伞这个分词’

select * from news where MATCH (content) against ('武汉 雨伞' in Boolean MODE);

在这里插入图片描述

无操作符则表示出现’武汉’或者’雨伞’的数据会有更高的相关性

select * from news where MATCH (content) against ('武汉  <雨伞' in Boolean MODE);

在这里插入图片描述

'武汉 <雨伞’表示需要检索到包含武汉的数据,但是当出现’雨伞’这个分词时,需要降低相关性,所以带有’雨伞’的数据会排在最后

select * from news where MATCH (content) against ('"全球 优秀"@5' in Boolean MODE);

这个@distance语法不知道为啥一直没有查出结果(待查明原因)

select * from news where MATCH (content) against ('武汉  ~雨伞' in Boolean MODE);

在这里插入图片描述

'武汉 ~雨伞’表示需要检索到包含武汉的数据,但是当出现’雨伞’这个分词时,相关性为负,所以带有’雨伞’的数据会排在最后(这个效果与<操作符有类似效果)

select * from news where MATCH (content) against ('全球*' in Boolean MODE);

在这里插入图片描述

*操作符的作用其实与like的通配符类似

select * from news where MATCH (content) against ('"武汉光谷"' in Boolean MODE);

在这里插入图片描述

双引号表示’武汉光谷’以短语的方式被检索到

校验ngram

第三节讲到了ngram分词,下面校验一下ngram分词:
在这里插入图片描述

以数据表的第一条文本为例:

select * from news where MATCH (content) against ('天有' in Boolean MODE);

在这里插入图片描述

检索’天有’这个分词能够检索出’武汉市今天有小雨,大家出门记得带雨伞’这条文本,说明这条文本的分词情况如下:

武汉 汉市 市今 今天 天有 有小 小雨 。。。

说明ngram(n=2)解析器将文本分成了以2为滑动窗口,将一段文本分成多个由2个连续单元组成的term

整个用下来,熟悉ES服务的同学可能已经发现了,这个跟ES操作还是很类似的。
参考:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html《Boolean Full-Text Searches》

自然语言模式

自然语言模式是默认全文检索模式,简单地说就是把检索关键词当做自然语言来处理,自然语言模式也等价于布尔模式中的无操作符模式,下面三种查询,结果是一样的:

-- 自然语言模式select * from news where MATCH (content) against ('技术 武汉 光谷' IN NATURAL LANGUAGE MODE);-- 布尔模式 无操作符select * from news where MATCH (content) against ('技术 武汉 光谷' in Boolean MODE);-- 默认模式select * from news where MATCH (content) against ('技术 武汉 光谷');

在这里插入图片描述

这三种查询结果和排序都是一样的。

拓展查询

拓展查询模式会进行两次查询,第一次查询命中关键词,第二次查询会根据第一次查询到的结果作为输入,再进行一次查询,下面举例说明:
首先,我们的doc列表如下:
在这里插入图片描述

先查询关键词’西湖’:

select * from news where MATCH (content) against ('西湖' WITH QUERY EXPANSION);

在这里插入图片描述

上面通过WITH QUERY EXPANSION查询’西湖’就返回一条与’西湖’相关的数据。

下面再插入一条数据:
在这里插入图片描述

再来拓展查询’西湖’:

select * from news where MATCH (content) against ('西湖' WITH QUERY EXPANSION);

再看结果:
在这里插入图片描述

发现多了一条与’西湖’无关的记录(就是刚刚新增的数据)。

那么为什么会出现这样的结果呢?
原因是拓展查询会根据第一次查询到的结果再进行一次查询,第一次查询到的结果是关于’西湖’的结果,结果里面包含’杭州’、‘美丽’、‘地方’等关键词,第二次查询会检索’杭州’、‘美丽’、'地方’等关键词,所以自然会查询到上面两条数据,下面在新增几条数据来验证:
在这里插入图片描述

上面新增数据11和12。
再次拓展查询’西湖’:

select * from news where MATCH (content) against ('西湖' WITH QUERY EXPANSION);

查询结果:
在这里插入图片描述

查询结果包括刚刚新增的11、12两条数据(因为这两条数据包括’西湖’关键字的第一次查询结果里面的关键词)。
上面的拓展查询结果相当于下面这两次查询:

-- 首先根据'西湖'关键词 查询出 '杭州'、'美丽'、'地方' 等结果select content from news where MATCH (content) against ('西湖' IN NATURAL LANGUAGE MODE)-- 再根据 '杭州'、'美丽'、'地方' 等结果二次查询select * from news where MATCH (content) against ('杭州 美丽 地方' IN NATURAL LANGUAGE MODE)

拓展查询很有可能查询出很多意想不到的结果,有点盲查的意思。

参考:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-query-expansion.html《Full-Text Searches with Query Expansion》
https://www.begtut.com/mysql/using-mysql-query-expansion.html《MySQL查询扩展》

7.相关性排序

InnoDB的全文搜索基于 Sphinx 搜索引擎,相关性排序算法采用的是 BM25 and TF-IDF ,熟悉ES的同学应该对TF-IDT不陌生,TF-IDT简单的来说就是:被检索关键词出现越多的doc相关性越高,包含高辨识度(整体上在doc里面出现的比较少)关键词的doc相关性越高,相关性越高,会被排在结果的前面。

SELECT*,MATCH ( content ) against ( '武汉 杭州' IN Boolean MODE ) AS score FROMnews ORDER BYscore DESC;

在这里插入图片描述

上面检索了’武汉’、‘杭州’两个关键词,从结果中可以看出:
● 出现’杭州’(因为’杭州’整体上出现的较少,所以辨识度较高 IDF)的记录(doc)得分较高(相关性交大),排在前面
● 武汉出现较多的记录得分也比较高(TF)

参考:
http://t.zoukankan.com/hoohack-p-5408933.html《Sphinx的介绍和原理探索》
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html《Boolean Full-Text Searches》
https://blog.csdn.net/zc1995730/article/details/122498012《TF-IDF算法原理和公式》

来源地址:https://blog.csdn.net/Princeliu999/article/details/128539216

您可能感兴趣的文档:

--结束END--

本文标题: Mysql全文索引

本文链接: https://www.lsjlt.com/news/374817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql全文索引
    1.背景简介 项目开发过程有时候会遇到全文检索的需求,但是数据量有时候比较小,不属于高并发高吞吐场景,这种场景搭建ES服务有点浪费资源,也把工程设计复杂了,所以需要采用更简单更廉价的方案。一般业务系统都会用到Mysql或者PostgreSQ...
    99+
    2023-08-18
    mysql 数据库 全文检索
  • mysql 全文索引
    停止词(stopword) ...
    99+
    2022-10-18
  • MySQL innodb 全文索引使用
    1、mysql 5.7 全文索引以下几个参数(配置文件/etc/my.cnf)#控制innodb全文检索分词的最小长度,如果设置为2那么一个汉字和一个字母将不能搜到ngram_token_size=1#存储...
    99+
    2022-10-18
  • MongoDB之索引(全文索引)
    在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是在某个字段上实现的模糊查询,但是这个时候返回的信息并不会很准确,因为只能够查A字段或者是B字段,而在MongoDB里面实现了非常简单的全文检索。 ...
    99+
    2022-10-18
  • mysql中什么是全文索引
    这篇文章将为大家详细讲解有关mysql中什么是全文索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明MyISAM存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。...
    99+
    2023-06-15
  • MySQL 全文索引使用指南
    全文索引需要特殊的查询语法。有没有索引都可以进行全文检索,但是存在索引时会提高匹配的速度。全文索引的索引通过特殊的结构存储以便于找到文档中包含搜索关键字对应的内容。在我们日常生活中,最常见的全文检索就是网络搜索引擎。...
    99+
    2022-05-14
    MySQL 全文索引 MySQL 索引
  • MySQL---单列索引(包括普通索引、唯一索引、主键索引)、组合索引、全文索引。
    1. 索引 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索 引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的 时间就越多,如果表中查询的列有一个索引,MySQL...
    99+
    2023-09-21
    数据库 mysql sql
  • SQL Server 全文搜索/全文索引
    全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引...
    99+
    2014-12-30
    SQL Server 全文搜索/全文索引
  • MySQL 全文索引的原理与缺陷
    MySQL全文索引一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单。 alter table tablename add fulltext(column1,column2) 说明: 只能在...
    99+
    2022-05-10
    MySQL 索引 mysql 全文索引
  • 怎么在MySQL中实现全文索引
    这期内容当中小编将会给大家带来有关怎么在MySQL中实现全文索引,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用用MATCH() ... AGAINST 方式来进行搜索...
    99+
    2022-10-18
  • mysql全文索引的概念是什么
    这篇“mysql全文索引的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
    99+
    2023-05-25
    mysql
  • MySql中的Full Text Search全文索引优化
    目录开篇一个简单的DEMO天下没有免费的午餐无索引使用 B 树索引引入反向索引在默认解析器中使用反向索引在 n-gram 解析器中使用反向索引InnoDB 反向索引性能下降备选方案开篇 在我们的生产环境中,有一个模糊检索...
    99+
    2023-05-12
    MySql全文索引优化 MySql全文索引优化
  • MySql中的Full Text Search全文索引优化
    目录开篇一个简单的DEMO天下没有免费的午餐无索引使用 B 树索引引入反向索引在默认解析器中使用反向索引在 n-gram 解析器中使用反向索引InnoDB 反向索引性能下降备选方案开...
    99+
    2023-05-20
    MySql全文索引优化 MySql Full Text Search
  • MySQL全文索引、联合索引、like查询、json查询速度哪个快
    查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775) 我们需要在这10万条数据中检索特定类型的...
    99+
    2022-05-15
    mysql 全文索引 mysql 联合索引 mysql like查询 mysql json查询
  • MySQL 中文全文检索
    创建索引(MySQL 5.7.6后全文件索引可用WITH PARSER ngram,针对中文,日文,韩文) ALTER TABLE 表 ADD FULLTEXT 索引名 (`字段`) WITH PARSER ngram;或者CREATE F...
    99+
    2023-09-17
    mysql 数据库
  • InnoDB全文索引是什么
    这篇文章主要介绍“InnoDB全文索引是什么”,在日常操作中,相信很多人在InnoDB全文索引是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB全文索引是什么”...
    99+
    2022-10-19
  • python做全文检索引擎
    ** python做全文检索引擎 ** 最近一直在探索着如何用python实现像百度那样的关键词检索功能。说起关键词检索,我们会不由自主地联想到正则表达式。正则表达式是所有检索的基础...
    99+
    2023-01-31
    引擎 全文 python
  • lucene全文索引是什么
    本篇内容主要讲解“lucene全文索引是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“lucene全文索引是什么”吧!一、Lucene介绍及应用Apache Lucene是当下最为流行的开源...
    99+
    2023-06-02
  • Mysql使用全文索引(FullText index)的实例代码
    目录什么是全文索引注意创建全文索引使用全文索引自然语言搜索BOOLEAN MODE总结什么是全文索引 全文索引,通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题....
    99+
    2022-11-13
  • mysql全文搜索fulltext
    mysql> select * from t2; +------+------+----------------------------+ | a    | b &nbs...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作