mysql全文检索简单应用

需求是这样的:项目中有一张模板表,模板项中有个大字段,存放这个模板具体的模板项信息以json字符串形式存放在该字段中,这样的好处是只有一张表,不用维护传统的模板表和模板项这两张表,并且查询时候的效率更高,应该只查询一张表嘛。不用进行连表查询。固然带来的缺点就是若是存在以模板项这个大字段的条件查询会很不方便。一开始通过讨论决定该字段制做保存和读取不存在针对该字段的条件查询,全部就这么作了。mysql

可是后面因为需求的进一步细化,有个这么个需求:sql

当客户选择了具体的模板项后,要先查询以前的模板是否存在相同的模板项,若是存在校验不经过,尴尬了须要由模板项组成的条件查询需求。json

一开始的想法是 where itemcode like  '%模板项A%' and  itemcode like  '%模板项B%'  itemcode like  '%模板项C%'  itemcode like  '%模板项D%' ...ui

后来发现不行 好比说有个模板A 包含:模板项A,模板项B搜索引擎

如今我要新建一个模板B包含:模板项A ,不和模板A重复模板项吧。可是经过like查询仍是区分不了。spa

还好以前看MySQL有全文检索这个功能,在这小试了一把,具体实现以下:code

建立模板表:索引

CREATE TABLE `enquiry_template_test` (
  `template_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '模板的id',
  `template_name` VARCHAR(60) COLLATE utf8_bin DEFAULT NULL COMMENT '模板名称',
  `company_id` BIGINT(20) DEFAULT NULL COMMENT '采购商公司',
  `company_name` VARCHAR(60) COLLATE utf8_bin DEFAULT NULL COMMENT '采购商公司名称',
  `item_code` TEXT COLLATE utf8_bin COMMENT '模板项信息',
  `valid_flag` TINYINT(4) DEFAULT '0' COMMENT '是否有效0有效,1失效',
  `created_time` DATETIME DEFAULT NULL COMMENT '建立时间',
  `user_id` BIGINT(20) NOT NULL COMMENT '建立人',
  PRIMARY KEY (`template_id`),
  FULLTEXT (item_code)
) ENGINE=MYISAM AUTO_INCREMENT=1130 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='模板表信息'

注意:mysql要使用全文检索,搜索引擎为MYISAM,需求添加FULLTEXT,能够在建表时添加,若是存在数据的导入,能够在导入后再添加,我感受是你懂的,索引嘛,查询快,插删改来着慢。字符串

由于个人数据量比较小,就不计较这些了。
it

移植原表的数据:

INSERT INTO enquiry_template_test
 SELECT * FROM enquiry_template;

进行查询:

SELECT *
FROM `enquiry_template_test`
WHERE MATCH(item_code) AGAINST('+0001 +0010 -0002 -0003 -0004 -0005 -0006 -0007 -0008 -0009 -0010 -0011 -0012 -0014 +0015' IN BOOLEAN MODE);

由于全部的模板项是固定的code分别从0001到0015。

当前台传递是否存在一个有0001,0010,0015三个模板项的模板的查询

虽然sql比较难看,可是至少知足需求了。

相关文章
相关标签/搜索