MySQL模糊查詢再也用不著 like+% 了!

前言
倒排索引


創(chuàng)建全文索引
1、創(chuàng)建表時(shí)創(chuàng)建全文索引語法如下:
CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200),title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (col_name) ) ENGINE=InnoDB;
輸入查詢語句:
SELECT table_id, name, space from INFORMATION_SCHEMA.INNODB_TABLESWHERE name LIKE 'test/%';

2、在已創(chuàng)建的表上創(chuàng)建全文索引語法如下:
CREATE FULLTEXT INDEX full_index_name ON table_name(col_name);使用全文索引
MATCH(col1,col2,...) AGAINST(expr[search_modifier])search_modifier:{IN NATURAL LANGUAGE MODE| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION| IN BOOLEAN MODE| WITH QUERY EXPANSION}
SELECTcount(*) AS countFROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( 'MySQL' );

上述語句,查詢 title,body 列中包含 'MySQL' 關(guān)鍵字的行數(shù)量。上述語句還可以這樣寫:
SELECTcount(IF(MATCH ( title, body )against ( 'MySQL' ), 1, NULL )) AS countFROM`fts_articles`;
SELECT*,MATCH ( title, body ) against ( 'MySQL' ) AS RelevanceFROMfts_articles;

相關(guān)性的計(jì)算依據(jù)以下四個(gè)條件:
SELECT*,MATCH ( title, body ) against ( 'for' ) AS RelevanceFROMfts_articles;

Boolean
select * from fts_test where MATCH(content) AGAINST('+Pease -hot' IN BOOLEAN MODE);Boolean 全文檢索支持的類型包括:
+:表示該 word 必須存在
-:表示該 word 必須不存在
(no operator)表示該 word 是可選的,但是如果出現(xiàn),其相關(guān)性會(huì)更高
@distance表示查詢的多個(gè)單詞之間的距離是否在 distance 之內(nèi),distance 的單位是字節(jié),這種全文檢索的查詢也稱為 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)語句表示字符串 Pease 和 hot 之間的距離需在30字節(jié)內(nèi)
* :表示以該單詞開頭的單詞,如 lik*,表示可以是 lik,like,likes
" :表示短語
下面是一些demo,看看 Boolean Mode 是如何使用的。
demo1:+ -
SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( '+MySQL -YourSQL' IN BOOLEAN MODE );
上述語句,查詢的是包含 'MySQL' 但不包含 'YourSQL' 的信息

demo2:no operator
SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE );

demo3:@
SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE );
上述語句,代表 "DB2" ,"IBM"兩個(gè)詞之間的距離在3字節(jié)之內(nèi)
SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( '+MySQL +(>databaseIN BOOLEAN MODE );
上述語句,查詢同時(shí)包含 'MySQL','database','DBMS' 的行信息,但不包含'DBMS'的行的相關(guān)性高于包含'DBMS'的行。

SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE );
上述語句,查詢包含 'MySQL' 的行,但如果該行同時(shí)包含 'database',則降低相關(guān)性。

demo6:*
SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( 'My*' IN BOOLEAN MODE );
上述語句,查詢關(guān)鍵字中包含'My'的行信息。

SELECT*FROM`fts_articles`WHEREMATCH ( title, body ) AGAINST ( '"MySQL Security"' IN BOOLEAN MODE );
上述語句,查詢包含確切短語 'MySQL Security' 的行信息。

-- 創(chuàng)建索引create FULLTEXT INDEX title_body_index on fts_articles(title,body);
-- 使用 Natural Language 模式查詢SELECT*FROM`fts_articles`WHEREMATCH(title,body) AGAINST('database');
使用 Query Expansion 前查詢結(jié)果如下:

-- 當(dāng)使用 Query Expansion 模式查詢SELECT*FROM`fts_articles`WHEREMATCH(title,body) AGAINST('database' WITH QUERY expansion);
使用 Query Expansion 后查詢結(jié)果如下:

1、直接刪除全文索引語法如下:
DROP INDEX full_idx_name ON db_name.table_name;2、使用 alter table 刪除全文索引語法如下:
ALTER TABLE db_name.table_name DROP INDEX full_idx_name;