mysql like全文检索_MySQL全文检索中Like索引的实现
在数据库使用中,DBA都会告诉大家SQL的LIKE条件为%XXX%号时,由于不能使用索引,当数据量变大时(比如超过百万条),全表扫描会导致性能很差。
但是在实际业务中,很难避免MySQL全文检索并Like索引的这种需求。比如模糊搜索用户帐号,昵称之类。既然这个需求必须做,但又不可以直接用LIKE。这里我和大家分享一下我们关于这种需求的一种解决方案。当然别人也可能采用过类似的办法,我不是很清楚。所以也用一下“原创”吧。
MySQL数据库很早就支持全文索引,但是全文索引和LIKE语句是不同的。具体点说,全文索引的单位是词,耳LIKE匹配的是字符。当然实际的区别更大,比如“老鼠爱大米”这段文本用全文搜索的话,条件“老鼠爱大米”,“老鼠和大米”,“大米老鼠”,“大米与老鼠”会搜索到内容,但是“爱”,“鼠爱”,“爱大”不会搜索到内容。反之,使用LIKE搜索时,“老鼠和大米”,“大米老鼠”,“大米与老鼠”不会找到内容,而“爱”,“鼠爱”,“爱大”会找到内容。我们这里不讨论两种方式的优劣,根据实际情况每种功能都会有各自的实际需求。比如对于大段文本,全文检索是最好的方法,但是对于姓名,帐号,昵称等很短的通常无意义文本,LIKE会更合适一些。
虽然全文检索和LIKE搜索不同,但是在特殊情况下,可以用全文搜索功能来实现LIKE搜索。具体就是每个字符作为一个词,而且使用双引号来限制词精确匹配(简单点说就是老鼠大米和大米老鼠不同),这样可以实现LIKE搜索的功能。
下面还是说一下具体的做法吧。
首先,数据库指定 --ft_min_word_len=2 --ft_stopword_file=""。第一个参数是告诉数据库,小于2个字符的词忽略。第二个是告诉数据库不忽略任何特殊词。这些设置是给实现功能创造条件。
然后建搜索表
CREATE TABLE tbl_search (
id int(10) unsigned NOT NULL auto_increment,
name varchar(500),
PRIMARY KEY (id),
FULLTEXT KEY idx_name (name)
) ENGINE=InnoDB AUTO_INCREMENT=1;
static String encode(String input) {
if (input == null) return null;
StringBuilder output = new StringBuilder();
for (int i = 0, c = input.length(); i < c; ++i) {
char ch = input.charAt(i);
if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z'
|| ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z'
|| ch == '_' || ch == '-') {
output.append(Integer.toHexString(ch)).append(' ');
} else if (ch >= 'a' && ch <= 'z' || ch >= 'a' && ch <= 'z') {
output.append(Integer.toHexString((int)ch - 32)).append(' ');
} else {
Character.UnicodeBlock block = Character.UnicodeBlock.of(ch);
if (block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| block == Character.UnicodeBlock.KATAKANA
|| block == Character.UnicodeBlock.HIRAGANA) {
output.append(Integer.toHexString(ch)).append(' ');
} else {
// do nothing
}
}
}
// trim blank
int last = output.length() - 1;
if (last > 0 && output.charAt(last) == ' ') {
output.deleteCharAt(last);
}
return output.toString();
}
使用上面的代码对要搜索的内容编码,比如内容是“蓝皮鼠2008”,编码后的结果是“84dd 76ae 9f20 32 30 30 38”。将编码后的内容存入name字段。使用如下SQL语句进行搜索
select * from tbl_search where match(name) against('"76ae 9f20 32"' in boolean mode)
这样就基本实现了MySQL全文检索中的Like索引。
mysql like全文检索_MySQL全文检索中Like索引的实现相关推荐
- mysql 全文检索_MySQL全文检索
一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAINST (expr [s ...
- mysql 8 全文检索_MySQL 8中使用全文检索示例
首先建议张册测试用的表test,并使用fulltext说明将title和body两列的数据加入全文检索的索引列中: drop table if exists test; create table te ...
- mysql Ngram 全文索引_MySQL 全文检索 ngram Mybatis
创建全文索引(FullText index) 创建表的同时创建全文索引 FULLTEXT (name) WITH PARSER ngram 通过 alter table 的方式来添加 alter ta ...
- mysql ngram 中文_MySQL 全文检索 ngram插件
InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...
- mysql 统计条目_mysql 统计表中条目数量的几种方法
mysql 统计表中条目数量的几种方法 展开 通常的方法是: select count(*) from `table_name` select count(1) from `table_name` s ...
- mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?
谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...
- mysql hash创建_Mysql自适应哈希索引(Adaptive Hash Index)创建的条件
官方文档: If a table fits almost entirely in main memory, a hash index can speed up queries by enabling ...
- mysql存储过程临时表_mysql存储过程中使用临时表
当工作在很大的表上时,您可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后多这些表运行查询. ...
- mysql 唯一编号_Mysql表中唯一编号的分配机制
最近遇到一个问题:高并发环境下,如何避免MYSQL一张表里的某些列不要重复. 方式一:使用Mysql自带的列唯一索引(Unique) 可以在声明表的时候就加入这样一个约束(下面是mysql的语法): ...
最新文章
- uiwebview 读取本地html,UIWebView加载本地HTML文件
- C# xml通过xslt转换为html输出
- “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
- ESB文件调用,windows服务
- yii2史上最简单式安装教程,没有之一
- protobuf在java应用中通过反射动态创建对象
- Apollo进阶课程㉙丨Apollo控制技术详解——控制器的类型
- c++11并发指南系列
- 人人皆知Python功能,你还不了解嘛?
- Fleury算法 求欧拉回路
- [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏
- 网站压力测试工具webbench使用说明
- 安装docker遇到的坑
- MMO 游戏中使用多核
- 使用 className 修改样式属性
- 星起航:短视频营销之场景化
- U盘中毒文件都不见了
- alooa是华为什么型号_alooa是华为什么型号 华为alooa型号是华为畅享7Plus
- Cardboard Talk01 HeadTracker
- 国产处理器服务器操作系统安装(海之舟服务器操作系统安装说明)
热门文章
- 转 jdk8 jvm调优参数配置
- 关于mybatis返回值使用包装类型还是基本类型
- 论文阅读笔记——模式物种中个体的自动检测和识别
- 无人驾驶技术入门(一):百度无人驾驶的引路人
- mysql按升序创建索引_MySQL建立索引的基础规则
- docker三种网络模式
- python自学训练营 免费_李笑来《Python入门自学训练营》课程全集下载链接 | 挖宝否...
- 错误HikariPool-1 - Exception during..+ Access denied for user ‘root‘@‘localhost‘ (using password: YES)
- Spring自动装配注解
- 2015中学计算机考试题,郑加平的作业-初中信息技术考试题-2015年德阳市中小学教师教学评价技能提升全员培训-中国教师研修网...