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比較難看,可是至少知足需求了。

相關文章
相關標籤/搜索