创建全文索引(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('张欣婷 <不是人' in boolean mode);

    同时使用>< 到这里终于有答案了,只要使用了 ><的都会往前排,而且>的总是排在<的前面

    1. 只要使用 ><的总比没用的 靠前

    2. 使用  >的一定比 <的排的靠前 (这就符合相关性提高和降低)

    3. 使用同一类的,使用的越早,排的越前。

 select * from tommy.girl where match(girl_name) against('张欣婷 >李秀琴 <练习册 <不是人>是个鬼' in boolean mode);

  ( ):可以通过括号来使用字条件。

    eg: +aaa +(>bbb <ccc)

    找到有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(Map<String, Object> map){
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();
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();
}
}

  前端传入数据格式name:"",name:"lime 1026", name:"1026" :  mobile:"",mobile:"lime 1026", mobile:"1026"

package com.das.mapper.staff;

import com.das.common.type.StaffBaseStatusEnum;
import com.das.common.type.StaffRecordTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.jdbc.SQL; import java.util.Map; /**
* @Author liangmy
* @Date 2018/2/9
*/
public class StaffProvider { public String getIdList(Map<String, Object> map){
Long storeBaseId = (Long) map.get("storeBaseId");
Long postBaseId = (Long) map.get("postBaseId");
StaffBaseStatusEnum status = (StaffBaseStatusEnum) map.get("status");
String name = (String) map.get("name");
String mobile = null == map.get("mobile") ? "" : "\"" + map.get("mobile") + "\"";
return new SQL(){
{
SELECT("`staff_base`.`id`");
FROM(" `das`.`staff_base`");
if(null != storeBaseId && storeBaseId > 0){
WHERE("store_base_id = #{storeBaseId}");
}
if(null != postBaseId && postBaseId > 0){
AND().WHERE("post_base_id = #{postBaseId}");
}
if(null != status){
AND().WHERE("status = #{status}");
}
if(StringUtils.isNotEmpty(name)){
AND().WHERE("MATCH(name) AGAINST('" + name + "' IN BOOLEAN MODE)");
}
if(StringUtils.isNotEmpty(mobile)){
AND().WHERE("MATCH(mobile) AGAINST('" + mobile + "' IN BOOLEAN MODE)");
}
}
}.toString();
}
}

  前端传入数据格式carNum:"",carNum:"1026"

package com.das.mapper.order;

import com.das.common.type.ReceiveBaseDurationEnum;
import com.das.common.type.VipTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.jdbc.SQL; import java.util.Map; /**
* @Author liangmy
* @Date 2018/2/28
*/
public class ReceiveBaseProvider { public String getReceiveBaseIdList(Map<String, Object> map) {
ReceiveBaseDurationEnum duration = (ReceiveBaseDurationEnum) map.get("duration");
VipTypeEnum type = (VipTypeEnum) map.get("type");
String carNum = null == map.get("carNum") ? "" : "\"" + map.get("carNum") + "\"";
return new SQL() {
{
SELECT("id");
FROM("receive_base");
if (null != duration) {
switch (duration){
case TODAY:
WHERE("TO_DAYS(mgt_create) = TO_DAYS(NOW())");
break;
case WEEK:
WHERE("DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(mgt_create)");
break;
case MONTH:
WHERE("DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(mgt_create)");
break;
case QUARTER:
WHERE("DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= date(mgt_create)");
break;
}
}
if (null != type){
AND().WHERE("JSON_CONTAINS(vip_base_type_item,'" + type + "')");
}
if(!StringUtils.isEmpty(carNum)){
AND().WHERE("MATCH(car_num) AGAINST('" + carNum + "' in boolean mode)");
}
ORDER_BY("mgt_create");
}
}.toString();
}
}

啦啦啦

MySQL使用全文索引(fulltext index)

InnoDB全文索引:N-gram Parser【转】

MySQL 全文检索 ngram Mybatis的更多相关文章

  1. MySQL 全文检索 ngram插件

    InnoDB全文索引:N-gram Parser[转] MySql5.7 建立全文索引 InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文 ...

  2. MySQL Fabric和MyBatis的整合过程中遇到的问题

    这是我昨天在整合MySQL Fabric和MyBatis时遇到的问题,花了大半天才解决的问题,解决的过程中在网上查找了很久,都没有找到解决的方案.现在记下来,希望能够帮助有同样问题的朋友.如果各位朋友 ...

  3. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  4. RDS MySQL 全文检索相关问题的处理

    RDS MySQL 全文检索相关问题 1. RDS MySQL 对全文检索的支持 2. RDS MySQL 全文检索相关参数 3. RDS MySQL 全文检索中文支持 3.1 MyISAM 引擎表 ...

  5. MySQL全文检索笔记 转载

    1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id ...

  6. mysql 全文检索的匹配问题

    开发过程中碰到一个关于mysql 全文检索的问题,控制台打印的SQL语句拿到数据库里执行,结果不对.后来发现原来是少了双引号.下面是网上找到的资料,我是看到这个才意识到自己的问题. 这是之前在数据库执 ...

  7. MySQL全文检索初探

    本文目的 最近有个项目需要对数据进行搜索功能.采用的LAMP技术开发,所以自然想到了MySQL的全文检索功能.现在将自己搜集的一些资料小结,作为备忘. MySQL引擎 据目前查到的资料,只有MyISA ...

  8. MySQL -- 全文检索

    mysql支持全文索引和全文检索--全文索引的索引类型是fulltext--全文索引只能用于innodb表和myisam表,对应的列类型只是支持char.varchar.text--mysql5.7. ...

  9. MySQL -- 全文检索(自然语言全文检索)

    自然语言全文本检索缺省或者modifier被设置为in natural language mode,都是进行自然语言检索.对于表中的每一行,match()都会返回一个关联值. mysql> CR ...

随机推荐

  1. Tyrion 中文文档(含示例源码)

    原文出处: Mr.Seven   Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Ty ...

  2. Mac使用Xcode配置openGL

    Mac使用Xcode配置openGL 博主这学期有图形学课要用到OpenGL,于是首先就开始配置开发环境了.应该说网上Windows上配置OpenGL教程比较多,Mac版的比较少.博主特来分享配置过程 ...

  3. CSS_级联和继承

    2016-11-06 <CSS入门经典>第七章 1.在HTML中使用CSS样式表的三种方式: (1)内联的样式表. eg:<em style="background-whi ...

  4. Linux Performance Profiling & Visualization

    https://github.com/figozhang/CLK/tree/master/CLK2016 http://www.linuxep.com/

  5. canvas/CSS仪表盘效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 尚未备份数据库 "***" 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。

    使用SQL Server 2005还原备份的数据库文件时出现的问题,如题. 前提:如果你有个数据库的.bak的备份文件. 右键点击 数据库任务-->还原-->数据库 1.还原的目标选择你要 ...

  7. SSH error ( Read from socket failed: Connection reset by peer ) and it's solution

    SSH error ( Read from socket failed: Connection reset by peer ) and it's solution ssh cann't connect ...

  8. vim8.0模式详解

    pattern pattern.txt For Vim version 8.0. 最近更新: 2017年8月 VIM 参考手册 by Bram Moolenaar 译者: lang2 http://v ...

  9. iOS:检测多媒体(相机、相册、麦克风)设备权限,弹框提示

    一.感言 新年伊始,万象更新,一转眼,就2019年了. 作为一个科班生,从事移动端开发好几年了,回顾曾经的摸爬滚打,兢兢业业,严格的来说,多少算是入行了. 过去成绩如何暂且不说,新的一年,我当加倍努力 ...

  10. selenium之 文件上传所有方法整理总结【转】

    本文转自:https://blog.csdn.net/huilan_same/article/details/52439546 文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家 ...