MySQL 全文检索 ngram Mybatis

创建全文索引(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();
        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使用全文索引(fulltext index)

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

原文地址:https://www.cnblogs.com/ClassNotFoundException/p/8487252.html

时间: 2024-10-31 16:50:14

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

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

RDS MySQL 全文检索相关问题 1. RDS MySQL 对全文检索的支持 2. RDS MySQL 全文检索相关参数 3. RDS MySQL 全文检索中文支持 3.1 MyISAM 引擎表 3.2 InnoDB 引擎表 4. like '%xxx%' 和全文检索的比较 4.1 like '%xxx%' 4.2 全文检索 5. ft_query_expansion_limit 参数作用 1. RDS MySQL 对全文检索的支持 RDS MySQL 5.5 仅 MyISAM 引擎表支持全

MySQL全文检索

一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAINST (expr [search_modifier]) search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION } 例如: SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('词1 词2 词

mysql 全文检索的匹配问题

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

query mysql database using mybatis in java

create database and table in mysql, and create mybatis java web using mybatis generator: the layout for mybatis java web program: generatorconfig.xml: UserMapper.java: UserMapper.xml: User.java: UserExample.java: mybatis-config.xml the User_User.java

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robbe.html i.  Robbe完整版本下载:Robbe完整版本(PHP测试程序, 开发帮助文档, WinNT下php各版本的dll文件)下载: http://code.google.com/p/robbe(“谷歌”无法使用) b) SCWS(简易中文分词) 基于HTTP/POST的分词 : htt

mysql全文检索简单应用

需求是这样的:项目中有一张模板表,模板项中有个大字段,存放这个模板具体的模板项信息以json字符串形式存放在该字段中,这样的好处是只有一张表,不用维护传统的模板表和模板项这两张表,而且查询时候的效率更高,应该只查询一张表嘛.不用进行连表查询.当然带来的缺点就是如果存在以模板项这个大字段的条件查询会很不方便.一开始经过讨论决定该字段制作保存和读取不存在针对该字段的条件查询,所有就这么做了. 但是后面由于需求的进一步细化,有个这么个需求: 当客户选择了具体的模板项后,要先查询之前的模板是否存在相同的

Maven+MySQL+Spring+SpringMVC+Mybatis(详细)

本来想写一个大而全的详细教程的,包括一些使用技巧,后来发现自己有点Hold不住的感觉(不信你试试),就改写一个扫盲篇了 整篇博文包括maven安装,mysql安装,环境搭建,以及配置扫盲.框架的搭建会从裸Mybatis来开始,到整合Spring,再到前台显示(SpringMVC). 首先来看maven的安装. 这个很简单,在官网上下载apache-maven-3.*.*-bin.zip或者apache-maven-3.*.*-bin.tar.gz(注意标识-bin) 博主这里下载的是apache

mysql逆向工程(mybatis plus)

1.添加依赖 <!--mybatisplus,加入该jar后,就不再需要mybatis-xxx.jar,mybatis-spring-xxx.jar了,它们会以依赖包的形式被自动维护--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatisplus.version}<

mysql逆向工程(mybatis)

1.添加插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <!--配置文件的位置--> <configurationFile>src/mai