Fulltext全文索引
Fulltext相關屬性
查看數據庫關於fulltext的配置
SHOW VARIABLES LIKE 'ft%'; -- ft就是FullText的簡寫
ft_boolean_syntax
Fulltext用法
MATCH (col1, col2,...) AGAINST (expr [search_modifier]) -- where條件后使用
三種搜尋方式
跟在against括號中expr 的后面。
IN BOOLEAN MODE
expr里有特殊字符輔助特殊的搜尋語法。
不剔除50%以上符合的row。
不自動以相關性反向排序。
可以對沒有FULLTEXT index的字段進行搜尋,但會非常慢。
限制最長與最短的字符串。
套用Stopwords。
IN NATURAL LANGUAGE MODE
string就是要搜尋的字符串。
沒有特殊字符。
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION
Fulltext遇到的問題
多個以uuid分割的拼接字符串
當用match against時會查出其他所有不相關的,-變成了一個分隔符,將uuid分割成很多部分,包含其中一部分都會被查出來。
解決方法
select temp.* from ( select * from `pay_hisory` where match(leavingId) against('fc60c2aa-fa98-4b0c-8d46-98b8dc9ebc24') -- 先把所有的查出來,作為子表 ) as temp where temp.leavingId = 'fc60c2aa-fa98-4b0c-8d46-98b8dc9ebc24' --再查詢精確的id,無意中發現mysql5.6這樣能查到,mysql5.7不可以;
上面這種在mysql5.6沒問題explain為兩條,但是到了mysql5.7,exlpain會變成一個simple
select * from ( select * from `pay_hisory` where match(leavingId) against('9a26175e-9ddf-4826-bd10-00d52067c62d') and 1=1 ) as a where leavingId like '%9a26175e-9ddf-4826-bd10-00d52067c62d%'; -- mysql5.7要用like