ngram mysql_MySQL数据库之MySQL 全文检索 ngram Mybatis
本文主要向大家介绍了MySQL数据库之MySQL 全文检索 ngram Mybatis ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。
创建全文索引(FullText index)
创建表的同时创建全文索引
FULLTEXT (name) WITH PARSER ngram
通过 alter table 的方式来添加
alter table `das`.`staff_base` add fulltext index staff_base_name(`name`) with parser ngram;
直接通过create index的方式(未测试)
CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`)
也可以在创建索引的时候指定索引的长度:
CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`(20))
删除全文索引(未测试)
直接使用 drop index(注意:没有 drop fulltext index 这种用法)
DROP INDEX full_idx_name ON tommy.girl ;
使用 alter table的方式
ALTER TABLE tommy.girl DROP INDEX ft_email_abcd;
使用全文索引
使用全文索引的格式: MATCH (columnName) AGAINST (‘string‘)
1. 自然语言模式下检索:
得到符合条件的个数
SELECT COUNT(*) FROM articles WHERE MATCH (title,body) AGAINST (‘数据库‘ IN NATURALLANGUAGE MODE);
得到匹配的比率
SELECT id, MATCH (title,body) AGAINST (‘数据库‘ IN NATURAL LANGUAGE MODE) AS score FROM articles;
2. 布尔模式下搜索,这个就相对于自然模式搜索来的复杂些:
匹配既有管理又有数据库的记录
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+数据库 +管理‘ IN BOOLEAN MODE);
匹配有数据库,但是没有管理的记录
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+数据库 -管理‘ IN BOOLEAN MODE);
匹配MySQL,但是把数据库的相关性降低
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘>数据库 +MySQL‘ INBOOLEAN MODE);
3. 查询扩展模式,比如要搜索数据库,那么MySQL,oracle,DB2也都将会被搜索到
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘数据库‘ WITH QUERY EXPANSION);
4. ft_boolean_syntax (+ ->
+ : 用在词的前面,表示一定要包含该词,并且必须在开始位置。
eg: +Apple 匹配:"Apple123" , "tommy, Apple"
- : 不包含该词,所以不能只用「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。
eg: MATCH (name) AGAINST (‘-lime +oracle‘)
匹配到: 所有不包含lime,但包含oracle的记录
空(也就是默认情况),表示可选的,包含该词的顺序较高。
例子:
apple banana 找至少包含上面词中的一个的记录行。或的关系
+apple +juice 两个词均在被包含。与的关系
+apple macintosh 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些
+apple -macintosh 包含 “apple” 但不包含 “macintosh”
> :提高该字的相关性,查询的结果会排在比较靠前的位置。
先不使用 >
select * from tommy.girl where match(girl_name) against(‘张欣婷‘ in boolean mode);
技术分享图片
单独使用 > 使用了>的李秀琴马上就排到最前面了
select * from tommy.girl where match(girl_name) against(‘张欣婷 >李秀琴‘ in boolean mode);
技术分享图片
单独使用
select * from tommy.girl where match(girl_name) against(‘张欣婷
技术分享图片
同时使用>的总是排在
1. 只要使用 >
2. 使用 >的一定比
3. 使用同一类的,使用的越早,排的越前。
select * from tommy.girl where match(girl_name) against(‘张欣婷 >李秀琴 是个鬼‘ in boolean mode);
技术分享图片
( ):可以通过括号来使用字条件。
eg: +aaa +(>bbb
找到有aaa和bbb和ccc,aaa和bbb,或者aaa和ccc(因为bbb,ccc前面没有+,所以表示可有可无),然后 aaa&bbb > aaa&bbb&ccc > aaa&ccc
~ :将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。
eg: +apple ~macintosh 先匹配apple,但如果同时包含macintosh,就排名会靠后。
* :通配符,这个只能接在字符串后面。
MATCH (girl_name) AGAINST (‘+*ABC*‘) #错误,不能放前面
MATCH (girl_name) AGAINST (‘+张筱雨*‘) #正确
" " :整体匹配,用双引号将一段句子包起来表示要完全相符,不可拆字。
eg: "tommy huang" 可以匹配 tommy huang xxxxx 但是不能匹配 tommy is huang。
MyBatis 中 使用 全文索引注意:
前端传入数据格式name:"",name:"lime oracle"
package com.das.mapper.service;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.jdbc.SQL;
import java.util.HashMap;
import java.util.Map;
/**
* @Author liangmy
* @Date 2018/2/26
*/
public class ServiceBaseProvider {
public String getServiceBaseList(Mapmap){
StringBuffer name = new StringBuffer();
for(String str : (null == map.get("name") ? " " : map.get("name").toString().trim() + " ").split(" ")){
name.append("+" + str + " ");
}
if(name.length() > 2) {
name.deleteCharAt(name.length() - 1);
}
String level = null == map.get("level") ? "" : map.get("level").toString();
System.err.println(name);
System.err.println(level);
return new SQL(){
{
SELECT("id");
FROM("service_base");
if(!StringUtils.isEmpty(name)) {
WHERE("match(name) against(\"" + name.toString() + "\" in boolean mode)");
}
if(!StringUtils.isEmpty(level)){
AND().WHERE("JSON_CONTAINS(level,‘" + level + "‘)");
}
}
}.toString();
}
}
以上就介绍了MySQL的相关知识,希望对MySQL有兴趣的朋友有所帮助。了解更多内容,请关注职坐标数据库MySQL频道!
ngram mysql_MySQL数据库之MySQL 全文检索 ngram Mybatis相关推荐
- isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法
本文主要向大家介绍了MySQL数据库之MySQL 出现 The table is full 的解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 当我们要写入新数据而发生& ...
- 无法打开数据库‘mysql_MySQL数据库之MYSQL无法启动解决方法
本文主要向大家介绍了MySQL数据库之MYSQL无法启动解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 在my.ini(linux下/etc/my.cnf)加上skip ...
- prepared statement mysql_MySQL数据库之MySQL Prepared Statement
本文主要向大家介绍了MySQL数据库之MySQL Prepared Statement ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. Summary: in this tuto ...
- mysql全文搜索插件_MySQL 全文检索 ngram插件
InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...
- 【MySQL全文检索教程2】中文语义分词检索,配置ngram解析器ngram_token_size,innodb_ft_min_token_size,innodb_ft_min_token_size
MySQL全文索引:中文语义分词检索(相似度匹配) 原文链接:https://blog.csdn.net/qq_39702981/article/details/125141024 通常情况下,全文检 ...
- MySQL使用全文索引+ngram全文解析器进行全文检索
一.前言 最近有项目需要使用mysql进行全文检索,由于之前都是使用的Elasticsearch数据库进行数据检索,因此查询了相关资料后,了解了mysql如何使用全文索引. 二.ngram全文分析器 ...
- mysql ngram 中文_MySQL 全文检索 ngram插件
InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...
- MySql的Ngram全文索引
前言 在我们日常开发中,很多时候会遇到对数据库中某个字段模糊查询的需求,也就是like某个字段,但是很多公司像阿里,京东都禁止使用like来对数据库进行模糊查询,原因是啥呢? 我们先来看下面三条语句 ...
- Mysql 索引 n-gram分词引擎使用
概述: 类似于书籍的目录,找到一本书的特定内容,需要首先找到内容对应页码,定位对应页码 存储引擎使用类似方法进行数据查找,先找到索引中对应值,然后根据匹配的索引找到对应行 实现原理: 索引的实现通常使 ...
最新文章
- bminfowindow是什么_三步实现地图自定义InfoWindow
- 工业用微型计算机(27)-dos和BIOS调用(1)
- 【数据结构与算法】实践 构造病种树结构
- 贪吃蛇的c语言代码怎么弄,刚学C语言,想写一个贪吃蛇的代码
- python将数据变成float32,Python:将numpy默认为float32
- DLL调用异常:The value of ESP was not properly
- xp共享文件夹服务器,xp共享文件夹服务器
- VC++6.0:一点击【打开】就闪退
- 三菱plc指令dediv_三菱plc中的DECMP指令是什么意思?
- matlab画图x轴
- 数说故事“AI虚拟偶像研究室”第二期虚拟偶像数据分析研究报告
- 支付宝转账系统后台或API接口,避坑
- [HR规划]什么是人力资源规划?(zt)
- 射频衰减器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 内蒙古科技大学计算机专业校企合作好不好,校企合作真的靠谱吗 有什么坏处...
- 什么是标称属性?什么是二元属性?什么是序数属性?
- vue自定义音频播放组件_易于创建Vue的自定义音频播放器组件
- 关于引用elasticsearch-rest-high-level-client版本冲突问题
- 云邦互联可以申请免费空间
- 零基础可以学习数据分析吗,有没有好的培训机构推荐?