创建全文索引(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. ES6 Set 和 Map

    ES5 模拟Set 与 Map 集合 Set 常用于检查对象中是否存在某个键名 Map集合常被用于获取已存的信息 所有对象的属性名必须是字符串,那么必须确保每个键名都是字符串类型且在对象中是唯一的 数 ...

  2. yii2 数据提供者 dataProvider

    数据提供者 dataProvider $dataProvider = new ActiveDataProvider([ 'query' => $query, // 如何来取得数据 'pagina ...

  3. 关于js函数对象的理解

    js中函数和对象的关系: 什么是对象?根据W3C上面的解释JS中所有事物都是对象,对象是拥有属性和方法的数据,由此可以看出除了基 本值类型不是对象(number.string.Boolean.Unde ...

  4. git https 请求报错 504

    git https 请求报错 504 原因可能是因为设置了代理,ubuntu/deepin 系统可以检查 /etc/profile ~/.bashrc 内有没有设置 https 的代理. 有的话,去掉 ...

  5. 通过pip安装python web

    提示 No module named 'utils' 我就pip install utils 提示 No module named 'db' 然后我就 pip install db 报错 No mod ...

  6. MyBatis架构与源码分析<资料收集>

    1.架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html .https://www.cnblogs.com/wangdaijun/p/5296 ...

  7. gitbook安装与使用,并使用docker部署

    本文简单介绍如何安装并使用gitbook,最后如何使用docker构建书籍镜像. 1. 前置条件 需要Nodejs环境,安装npm,国内用户再安装cnpm npm install -g cnpm -- ...

  8. 转发:CentOS下tar压缩排除某个文件夹或文件及解压

     一.压缩 一般直接用tar命令打包很简单,直接使用 tar -zcvf test.tar.gz test 即可. 在很多时候,我们要对某一个目录打包,而这个目录下有几十个子目录和子文件,我们需要在打 ...

  9. SharePoint online 获取文件版本记录

    endpoint: _api/web/GetFileByServerRelativeUrl('/allDoc/xxx.pdf')/Versions 问题: 第一次使用,无论在本地还是o365上,都只返 ...

  10. 阿里云 nginx配置ssl证书实现https访问

    一,环境说明 服务器系统:ubuntu16.04LTS 服务器IP地址:47.89.12.99 域名:bjubi.com 二,域名解析到服务器 在阿里云控制台-产品与服务-云解析DNS-找到需要解析的 ...