FULLTEXT 搜索
MySQL 的全文搜索功能,不使用模板匹配操作的情況下,進(jìn)行單詞或短語(yǔ)的查找。
全文搜索 3 種類型:
- 自然語(yǔ)言搜索:將搜索字符串解析成一系列的單詞,搜索出包含這些單詞的行。
- 布爾模式搜索:搜索字符串中的單詞包含修飾字符,用以表明某些特定的要求。
- 查詢擴(kuò)展搜索:第一階段:自然語(yǔ)言搜索;第二階段:將搜索字符串與第一階段搜索的那些行連接起來(lái),然后再進(jìn)行一次搜索。
想要對(duì)表進(jìn)行全文搜索,需要?jiǎng)?chuàng)建一個(gè)特殊類型的索引:
- 基于 FULLTEXT 索引
- 忽略掉一些常見(jiàn)詞(常見(jiàn):50%的行里出現(xiàn)過(guò))
- 內(nèi)建的常用單詞(如:the after otfer)
- 少于 4 個(gè)字符的單詞也會(huì)被忽略
- 全文搜索對(duì)單詞的定義:由字母、數(shù)字、撇號(hào)和下劃線構(gòu)成的字符序列
- 可以為單個(gè)列或多個(gè)列創(chuàng)建 FULLTEXT 索引
自然語(yǔ)言 FULLTEXT 搜索
建表之后,使用運(yùn)算符 match() 列出一個(gè)或多個(gè)用于搜索的列,并用 against() 指定搜索字符串
CREATE TABLE apothegm(
attribution VARCHAR(40) COMMENT '名人',
phrase TEXT COMMENT '名言'
)ENGINE = MyISAM;
-- 如果按 "名人"、"名言"、"名人+名言" 來(lái)搜索
ALTER TABLE apothegm
ADD FULLTEXT (phrase),
ADD FULLTEXT (attribution),
ADD FULLTEXT (phrase,attribution);
-- 把 phrase 所有包含單詞"time" OR "soft" 的行找出來(lái),默認(rèn)全文搜索模式
SELECT * FROM apothegm WHERE match(phrase) against('time soft');
布爾模式的全文搜索
該模式,可以獲得對(duì)多單詞搜索的更多控制,使用 against('xxx' IN BOOLEAN MODE),有以下特點(diǎn):
- 不會(huì)忽略掉常見(jiàn)詞(50%)
- 查詢結(jié)果不再排序
- 搜索可以要求短語(yǔ)里的所有單詞按照特定順序出現(xiàn)
- 也可以未創(chuàng)建 FULLTEXT 索引的列,進(jìn)行布爾模式的全文搜索,只是慢一些。
-- 搜索包含 "bell book and candle" 這四個(gè)單詞,且單詞順序一樣的行
SELECT * FROM apothegm
WHERE match(attribution,phrase)
against('"bell book and candle"' IN BOOLEAN MODE);
-- 搜索包含 bell 但不包含 candle 的行
-- against('+bell -candle' IN BOOLEAN MODE);
-- 搜索單詞以 soft 開(kāi)頭的行,如 soft* 與 soft、softly、softness 等相匹配
-- against('soft*' IN BOOLEAN MODE);
查詢擴(kuò)展全文搜索
使用 against('xxx' WITH QUERY EXPANSION);
SELECT * FROM apothegm
WHERE MATCH(attribution,phrase)
against('bell book' WITH QUERY EXPANSION);
配置全文搜索引擎
ft_min_word_len 和 ft_max_word_len 用于確定 FULLTEXT 索引里的那些單詞所具有的最小長(zhǎng)度(默認(rèn) 4)和 最大長(zhǎng)度(默認(rèn) 84)。