创建全文索引(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. Python核心编程(第二版)正则表达式练习题解

    15-1. 识别下列字符串:“bat,” “bit,” “but,” “hat,” “hit,” 或 “hut” from re import match word = raw_input('inpu ...

  2. JSAP102

    JSAP102 1.API //案例:禁用文本框 <body> <input type="button" value="禁用" id=&quo ...

  3. pygame-KidsCanCode系列jumpy-part8-记录历史最高分

    通常在多玩家的游戏中,每个玩家都会有自己的得分,最高分数会成为该游戏的最佳记录.这一篇,学习下如何记录最高得分:(为了简化代码,本文采用文件方式,仅记录本机得分,明白原理后,可以将得分保存在云端或数据 ...

  4. log4j2发送消息至Kafka

    title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知.做了一番调研后才发现log4j2默认 ...

  5. React进阶之高阶组件

    前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只不过传入的参数变成了react ...

  6. Python中syncio和aiohttp

    CPython 解释器本身就不是线程安全的,因此有全局解释器锁(GIL),一次只允许使用一个线程执行 Python 字节码.因此,一个 Python 进程通常不能同时使用多个 CPU 核心.然而,标准 ...

  7. mysql函数之SUBSTRING_INDEX(str,"/",-1)

    SUBSTRING_INDEX的用法: •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前,从字符串str返回自字符串.若count为正值 ...

  8. Android设置屏幕旋转后保存数据

    1.onCreate()方法中最后判断需要保存的状态值 if(savedInstanceState != null){ mCurrentIndex = savedInstanceState.getIn ...

  9. 【ASP.NET Core】浅说目录浏览

    何谓“浅说”?就是一句话说不完,顶多两句话就介绍完毕,然后直接给上实例的解说方式.化繁为简,从七千年前到现在,从老祖宗到咱们,一直都在追求的理想目标,尽可能把复杂的东西变成简单的. 老周告诉你一个可以 ...

  10. alibaba的springcloud孵化器项目

    Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式 ...