MySQL 全文检索 ngram Mybatis

MySql全文索引+Ngram MySQL 内置的全文解析器使用单词之间的空格作为分隔符,这对于不使用空格做分隔符的语言是一种限制。为了解决这一限制,MySQL提供了一个支持中文、日文和韩文(CJK)的ngram全文解析器。ngram 全文解析器支持InnoDB和MyISAM的全文索引。ngram解析器将文本序列分词为连续的n个字符。例如,你可以使用ngram全文解析器为“早上好呀”进行不同值的n分词。n=1: '早', '上', '好', '呀'n=2: '早上', '上好', '好呀'n=3: '早上好', '上好呀' 阅读详情

创建全文索引(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【转】

基于SpringBoot与MyBatis的校园二手交易平台:从架构设计到部署上线的全链路实战解析 在Java Web开发领域,SpringBoot与MyBatis的组合已成为构建企业级应用的主流技术选型。SpringBoot通过约定大于配置的理念,极大地简化了项目初始化和部署流程;而MyBatis作为半自动化的ORM框架,则让开发者能够灵活控制SQL,便于性能优化与问题排查。这一技术栈的核心价值在于,它能高效支撑起一个具备完整业务逻辑的Web应用,例如一个典型的校园二手交易平台。此类平台涉及用户管理、商品发布、订单交易等核心业务场景,是理解如何将技术应用于解决实际业务问题的绝佳样本。通过剖析此类项目,开 阅读详情

相关推荐

WKWebView 白屏问题,WKWebView request body丢失问题

1,WKWebView 白屏问题 WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。初次适配 WKWebView 的时候,我们也惊讶于打开 WKWebView 后,App 进程内存消耗反而大幅下降,但是仔细观察会发现,Other Process 的内存占用会...

weixin_37543822的博客 734

MySQL 的 ngram 全文解析器

mysql 的 ngram 全文解析器,ngram_token_size配置和使用

jkzyx123的博客 2186

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

BIM的乐趣 1728

MySql的Ngram全文索引

前言 在我们日常开发中,很多时候会遇到对数据库中某个字段模糊查询的需求,也就是like某个字段,但是很多公司像阿里,京东都禁止使用like来对数据库进行模糊查询,原因是啥呢? 我们先来看下面三条语句 其中title添加了索引 1.SELECT id,title from test_user where title like '张三%' 2.SELECT id,title from test_user where title like '%张三' 3.SELECT id,title from test_use

weixin_45486746的博客 3551

从手机到单片机:聊聊ARM Cortex家族那些事,A、R、M系列到底有啥不同?

本文深入解析ARM Cortex家族的A、R、M三大系列处理器,揭示它们在性能、实时响应和能效方面的核心差异。从智能手机到汽车电子和物联网设备,Cortex-A、R、M各司其职,分别应对复杂运算、实时控制和超低功耗场景。通过技术指标对比和典型应用案例,帮助开发者理解如何根据DMIPS/MHz等关键参数选择适合的处理器架构。

weixin_31574149的博客 350

通达信短周期指标盘中实时监控与预警选股实战

本文详细介绍了通达信短周期指标在盘中实时监控与预警选股中的实战应用。通过分时指标改造、多股同列监控技巧及预警策略优化,帮助短线交易者捕捉转瞬即逝的交易机会,提升选股效率与准确性。重点解析了如何避免假信号干扰及系统卡顿问题,并探讨了从预警到自动交易的进阶应用。

weixin_29230805的博客 887

MySQL使用全文索引+ngram全文解析器进行全文检索

ngram是全文解析器能够对文本进行分词,中文分词用ngram_token_size设定分词的大小,ngram_token_size的值就是连续n个字的序列示例使用ngram对于‘全文索引进行分词’ngram_token_size=1,分词为‘全‘,’文‘,’索‘,’引‘ngram_token_size=2,分词为‘全文‘,’文索‘,’索引‘ngram_token_size=3,分词为‘全文索‘,’文索引‘ngram_token_size=1,分词为‘全文索引‘.........

后端开发 5409

STM32学习笔记(江协科技)-----OLED显示屏

SSD1306简介:•SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务••驱动接口:128个SEG引脚和64个COM引脚,对应128*64像素点阵显示屏••内置显示存储器(GDDRAM):128*64 bit128*8 ByteSRAM••供电:IC逻辑),VCC=7~15V(面板驱动)••通信接口:8位6800/8080并行接口,3/4线SPI。

lu322f的博客 1061

mac mysql ngram_MySQL ngram

MySQL ngram简介:本教程向您展示如何使用MySQL ngram全文解析器来支持中文,日文,韩文等表意语言的全文搜索。MySQL ngram全文解析器简介内置的MySQL全文解析器使用空格确定单词的开头和结尾。当涉及到诸如中文,日文或韩文等的表意语言时,这是一个限制,因为这些语言不使用单词分隔符。为了解决这个问题,MySQL提供了ngram全文解析器。从版本5.7.6开始,MySQL包含n...

weixin_33246707的博客 606

手把手教你用LaTeX完成Elsevier期刊投稿:附完整文件上传清单与注意事项

本文提供了一份详尽的Elsevier期刊LaTeX投稿实战指南。文章系统拆解了从稿件准备、文件上传到最终提交的全流程,重点解析了Manuscript、Figure(s)等关键文件的上传逻辑与注意事项,并附有PDF生成前后的详细检查清单,旨在帮助研究者高效、规范地完成投稿,规避常见错误。

weixin_29300931的博客 486

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1448

mysql全文搜索案例_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的方式(...

weixin_39895481的博客 321

TBOX电源方案的详细讲解与分析

输入保护电路是确保车载电子系统稳定性的关键。通过合理选择TVS二极管、保险丝和浪涌抑制器等元器件,能够有效防止来自电源系统的瞬态过电压、浪涌和过流问题,保护后续电路免受损害。针对不同的电源环境和应用场景,可以通过提升功率、优化热管理以及选择高效元器件来进一步提高系统的保护能力和可靠性。

weixin_43199439的博客 1070

ngram mysql_MySQL数据库之MySQL 全文检索 ngram Mybatis

本文主要向大家介绍了MySQL数据库之MySQL 全文检索 ngram Mybatis ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。创建全文索引(FullTextindex)创建表的同时创建全文索引FULLTEXT(name)WITHPARSERngram通过altertable的方式来添加altertable`das`.`staff_base`add...

weixin_39624094的博客 146

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

mysql Ngram 全文索引_MySQL数据库之MySQL 全文检索 ngram Mybatis

本文主要向大家介绍了MySQL数据库之MySQL 全文检索 ngram Mybatis ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。创建全文索引(FullTextindex)创建表的同时创建全文索引FULLTEXT(name)WITHPARSERngram通过altertable的方式来添加altertable`das`.`staff_base`add...

weixin_42377407的博客 485

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mysql Ngram 全文索引_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的方式(...

weixin_39710660的博客 311

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

mac mysql ngram_MySQL 全文检索 ngram Mybatis

建立全文索引(FullText index)html建立表的同时建立全文索引前端FULLTEXT (name) WITH PARSER ngramjava经过 alter table 的方式来添加sqlalter table `das`.`staff_base` add fulltext index staff_base_name(`name`) with parser ngram;数据库直接经过...

weixin_39989941的博客 156

mysql n gram parser_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的方式(...

weixin_31993501的博客 350

MySQL 5.6全文检索实战:解决LIKE慢查与中文搜索难题

全文检索是一种基于倒排索引的高效文本匹配技术,其核心原理是分词→过滤→归一化→构建词元到文档ID的映射,再通过TF-IDF等算法实现相关性排序。相比传统LIKE全表扫描,它能将模糊查询性能提升百倍,显著降低CPU负载和响应延迟。该技术在电商商品搜索、新闻标题检索、后台运营系统等需要高并发关键词匹配的场景中具有关键价值。本文聚焦MySQL 5.6在Ubuntu 16.04环境下的落地实践,重点解决LIKE性能瓶颈和中文分词失效两大痛点,结合jieba预分词、布尔模式精准控制、索引调优等工程方案,提供零外部依赖

weixin_34090562的博客 434

mysql

文章目录易错点mysql常见保留字 易错点 1.直接使用select* from order报错,因为order是关键字,需要使用反引号引起来。这也就是为什么你会看到有些sql语句不需要引起来,而有些需要。 mysql常见保留字 ...

qq_41743601的博客 709

【多选模糊查询】多选模糊查询, 全文检索 和 正则匹配,任选其一 查出结果的3种实现

【多选模糊查询】多选模糊查询, 全文检索 和 正则匹配,任选其一 查出结果的3种实现

qq120631157的博客 971

SpringBoot+Vue构建企业级多维知识管理系统

知识管理系统是企业数字化转型的核心基础设施,其核心价值在于实现信息的结构化存储与智能检索。通过SpringBoot+Vue技术栈构建的系统架构,采用动态维度建模技术解决传统分类体系固化问题,结合MPTT算法实现高性能分类树查询。在工程实践层面,系统整合了MySQL全文检索与Elasticsearch混合搜索方案,并基于RBAC扩展模型实现细粒度权限控制。典型应用场景包括制造业设备知识库、医疗科研文献平台等,其中Vuex状态管理可降低40%内存占用,MyBatis-Plus使多维度查询代码量减少60%。这种架

weixin_30788239的博客 566

SpringBoot+Vue高校就业招聘系统开发实践

现代Web应用开发中,前后端分离架构已成为主流技术方案。SpringBoot作为Java领域的轻量级框架,通过自动配置和starter依赖显著提升开发效率,其内嵌服务器特性简化了部署流程。Vue.js凭借响应式数据绑定和组件化开发优势,特别适合处理动态表单等交互场景。在招聘系统这类企业级应用中,这种技术组合能有效解决信息孤岛、流程效率等核心问题。通过RBAC权限控制、TF-IDF智能匹配算法等关键技术实现,系统可完成高校、学生与用人单位的高效对接。结合MySQL优化、多级缓存等性能调优手段,最终构建出高并发

weixin_33924770的博客 653
上一篇: mysql /*! 50100 ... */ 条件编译
下一篇: Nginx 反向代理获取设备真实的IP地址
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值