Mysql——全文索引

概念:

一般查詢都是根據數值範圍或者精準的字符串進行數據過濾查詢,而全文索引則通過關鍵字的匹配來進行查詢過濾,那麼就需要基於相似度的查詢,而不是原來的精確數值或字符串比較。

版本支持:

  • 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分詞器把中文段落預處理拆分成單詞,然後存入數據庫。
  • 從MySQL 5.7.6開始,MySQL內置了ngram全文解析器,用來支持中文、日文、韓文分詞。
  • 只有字段的數據類型爲 char、varchar、text 及其系列纔可以建全文索引。

ngram全文解析器配置:

MySQL 中使用全局變量ngram_token_size來配置ngram中分詞的大小,它的取值範圍是1到10,默認值是2。如果需要搜索單字,就要把ngram_token_size設置爲1。在默認值是2的情況下,搜索單字是得不到任何結果的。

全局變量ngram_token_size的兩種設置方法:
1、啓動mysqld命令時

mysqld --ngram_token_size=2

2、修改MySQL配置文件

[mysqld] 
ngram_token_size=2

全文檢索模式(兩種):

/*
創建表  
‘INT(10)、VARCHAR(20)’指數據類型(長度)   
‘NOT NULL、ZEROFILL、AUTO_INCREMENT、DEFAULT、COMMENT’分別指屬性非空、補零、自增、添加默認值、添加備註
‘PRIMARY KEY’指設置主鍵
‘ENGINE=INNODB’指數據庫引擎爲INNODB
‘CHARSET=UTF8’指字符集爲UTF8
*/ 
CREATE TABLE `goods`( 
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '商品表id',
`good_name` VARCHAR(20) NOT NULL DEFAULT 'NULL' COMMENT '商品名',
`good_num` INT(10) NOT NULL DEFAULT 0 COMMENT '商品數量',
`good_barcode` INT(20) ZEROFILL NOT NULL  COMMENT '商品編碼',
`add_time` INT(11) COMMENT '添加時間',
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=UTF8;

#插入多條數據
INSERT INTO `goods` (`good_name`,`good_num`,`good_barcode`,`add_time`) VALUES ('手機','6','888','0'),('鞋子','7','999','0'),
('美版手機iphone','3','555','0'),('大陸手機華爲','2','666','0'),('襪子','3','777','0');

-- 添加FULLTEXT(全文索引) 
ALTER TABLE `goods` ADD FULLTEXT (`good_name`) WITH PARSER ngram;

1、自然語言模式(NATURAL LANGUAGE MODE)
自然語言模式是MySQL 默認的全文檢索模式。自然語言模式不能使用操作符,不能指定關鍵詞必須出現或者必須不能出現等複雜查詢。

#不指定模式,默認使用自然語言模式
SELECT * FROM `goods` WHERE MATCH (`good_name`) AGAINST ('手機') ORDER BY id;

結果:在這裏插入圖片描述
2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支持指定關鍵詞必須出現或者必須不能出現或者關鍵詞的權重高還是低等複雜查詢。

#使用BOOLEAN MODE模式,需要指定 IN BOOLEAN MODE 
SELECT * FROM `goods` WHERE MATCH (`good_name`) AGAINST ('+手機 -美版' IN BOOLEAN MODE);

'apple banana' :無操作符,表示或,要麼包含apple,要麼包含banana

'+apple +juice':必須同時包含兩個詞

'+apple macintosh':必須包含apple,但是如果也包含macintosh的話,相關性會更高。

'+apple -macintosh':必須包含apple,同時不能包含macintosh。

'+apple ~macintosh':必須包含apple,但是如果也包含macintosh的話,相關性要比不包含macintosh的記錄低。

'+apple +(>juice <pie)':查詢必須包含apple和juice或者apple和pie的記錄,但是apple juice的相關性要比apple pie高。

'apple*':查詢包含以apple開頭的單詞的記錄,如apple、apples、applet。

'"some words"':使用雙引號把要搜素的詞括起來,效果類似於like '%some words%',例如“some words of wisdom”會被匹配到,而“some noise words”就不會被匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章