mysql全文索引

2021-09-19 14:20:27 字數 3770 閱讀 4356

舊版的mysql的全文索引只能用在myisam**的char、varchar和text的字段上。 

不過新版的mysql5.6.24上innodb引擎也加入了全文索引,所以具體資訊要隨時關注官網,

create table article ( 

id int auto_increment not null primary key, 

title varchar(200), 

content text, 

fulltext(title, content) 

) type=myisam;

alter table table_name add fulltext index index_name (column1,column2,...);
或者:

alter table table_name add fulltext index_name(column1,column2,...);
create fulltext index index_name on table_name (column1,column2,...)
也可以在建立索引的時候指定索引的長度:   

create fulltext index index_name on table_name (column1(20));
drop index index_name on table_name ;
alter table table_name drop index index_name;
跟普通索引稍有不同

使用全文索引的格式:match (columnname) against ('string')

eg:select * from `student` wherematch(`name`)against('聰')

當查詢多列資料時:

建議在此多列資料上建立乙個聯合的全文索引,否則使用不了索引的。

select * from `student` wherematch(`name`,`address`)against('聰 廣東')

分詞,全文索引以詞為基礎的,mysql預設的分詞是所有非字母和數字的特殊符號都是分詞符(外國人嘛)

使用命令:mysql> show variables like 'ft%'; #ft就是fulltext的簡寫

ft_boolean_syntax+ ->#改變in boolean mode的查詢字元,不用重新啟動mysql也不用重建索引

ft_min_word_len    4                                   #最短的索引字串,預設值為4,(通常改為1)修改後必須重建索引檔案

重新建立索引命令:repair table tablename quick

ft_max_word_len    84                                #最長的索引字串,預設值為84,修改後必須重建索引檔案

ft_query_expansion_limit   20                      #查詢括展時取最相關的幾個值用作二次查詢

ft_stopword_file(built-in)#全文索引的過濾詞檔案,具體可以參考:mysql全文檢索中不進行全文索引預設過濾詞

特別注意:50%的門坎限制(當查詢結果很多,幾乎所有記錄都有,或者極少的資料,都有可能會返回非所期望的結果)

-->可用in boolean mode即可以避開50%的限制。

此時使用全文索引的格式就變成了:select * from `student` where match(`name`) against('聰' in boolean mode)

eg: match (girl_name) against ('-林志玲 +張筱雨')

匹配到: 所有不包含林志玲,但包含張筱雨的記錄 

例子:找至少包含上面詞中的乙個的記錄行

兩個詞均在被包含

例子:4.5.1.先不使用 >

select * from tommy.girl where match(girl_name) against('張欣婷' in boolean mode);

4.5.2. 單獨使用 >

select * from tommy.girl where match(girl_name) against('張欣婷 >李秀琴' in boolean mode);

4.5.3. 單獨使用 <

select * from tommy.girl where match(girl_name) against('張欣婷 《不是人' in boolean mode);

4.5.4.同時使用》<

select * from tommy.girl where match(girl_name) against('張欣婷 >李秀琴 《練習冊 《不是人 >是個鬼' in boolean mode);

小結一下:1. 只要使用 >《的總比沒用的 靠前;

2. 使用  >的一定比 《的排的靠前 (這就符合相關性提高和降低);

3. 使用同一類的,使用的越早,排的越前。

eg: +aaa +(>bbb 然後 aaa&bbb>aaa&bbb&ccc>aaa&ccc

match (girl_name) against ('+*abc*')   #錯誤,不能放前面

match (girl_name) against ('+張筱雨*')  #正確

eg:  "tommy huang" 可以匹配tommy huang***xx   但是不能匹配tommyishuang

找到你的 mysql服務,右鍵properties,找到你的my.ini所在的路徑

然後使用命令show variables like 'ft_min_word_len';檢視是否生效了

mysql全文索引的坑 MySQL全文索引問題

我有乙個包含以下資料的 文章 mysql select from articles id title body 1 mysql tutorial dbms stands for database 2 how to use mysql well after you went through a 3 o...

mysql全文索引

了解 solr 之後 發現全文索引也能做檢索 故了解了下 筆記如下 建立全文索引 alter table table add fulltext index fulltext table 列1 列2 查詢方式 select from table where match 列1 列2 against 查詢...

MySQL 全文索引

ngram就是一段文字裡邊聯絡的n個字的序列,例如ngram對生日快樂進行分詞 n 1 生 日 快 樂 n 2 生日 日快 快樂 n 3 生日快 日快樂 n 4 生日快樂 learn是資料庫 test是表名 當新增加一條資料時,會把設定全文索引的那個欄位的值進行分詞排序顯示 select from ...