mysql 中文字段名_MySQL全文索引怎么做?| 教程分享
- 點擊上方“愛數據學習社”關注我們吧!?-
文末領取【商業分析資料】
為什么要用全文索引我們在用一個東西前,得知道為什么要用它,使用全文索引無非有以下原因:
like查詢太慢、json字段查詢太慢(車太慢了)
沒時間引入ElasticSearch、Solr或者Sphinx這樣的軟件,或者根本就不會用(無法將五菱宏光換成蘭博基尼,即使有蘭博基尼也不會開)
加索引、聯合索引啥的都已經慢得不行了(限速80,車頂蓋都卸了也只能開到30)
為了提升一下自己的格調(人家問你有沒有開過法拉利,你說開過肯定更有氣質一點)
簡單的說,全文索引就相當于大詞典中的目錄,通過查詢目錄可以快速定位到想看的內容。
全文索引通過建立倒排索引來快速匹配文檔(僅在mysql5.6版本以上支持),全文索引將連續的字母、數字和下劃線當做一個單詞,分割單詞一般用空格/逗號/句號。
MySQL的全文索引支持以下3種查詢模式:
自然語言模式(IN NATURAL LANGUAGE MODE)
通過MATCH AGAINST 傳遞某個特定的字符串來進行檢索布爾模式(IN BOOLEAN MODE)
支持操作符,例如+表示包含,-表示不包含擴展模式(WITH QUERY EXPANSION)
相當于自然語言模式下的一個擴展,執行兩次檢索,第一次使用給定短語檢索,第二次是結合第一次相關性比較高的行進行檢索.
下面教大家如何創建全文索引,并創建測試數據演示三種查詢模式的使用。
如何創建全文索引1. 建表時指定
CREATE TABLE light_weight_baby ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT(title, content) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;2. ALTER添加
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);3. CRATE INDEX添加
CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);創建測試數據創建一個數據庫用來演示這三種模式下的檢索:
CREATE DATABASE chenqionghe DEFAULT CHARSET utf8;創建一個文章表并插入測試數據
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body)) ENGINE=InnoDB;插入測試數據
INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');執行結果如下
查詢-使用自然語言模式這是MySQL的默認查詢模式,簡單示例如下:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);可以看到,不區分大小寫,title或body包含database的都返回了,另外,返回的結果將以相關性進行排序。
相關性:根據行中的字段、唯一單詞的數量、集合中單詞總數和包含特定單詞的行數計算。
下面通過兩種方式統計數量:
# 第一種方式 SELECT COUNT(*) FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);# 第二種方式SELECT COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count FROM articles;第一種做了一些額外的工作(按相關性對結果進行排序),但也能使用索引進行查詢。
第二種執行了全表掃描,如果搜索項出現在大多數行中,可能比索引查詢更快。
匹配少數行,第一種快,匹配大多數行,第二種快。
下面演示如何檢索相關性,但不會進行排序(因為不包含WHERE和ORDER BY)
SELECT id, MATCH (title,body) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score FROM articles;下面的示例更復雜,返回倒序后的相關性值,分別在SELECT和WHERE語句中使用了MATCH,但是不會導致額外的開銷,因為mysql優化器注意到兩次MATCH是相同的,只會使用一次全文搜索。
SELECT id, body, MATCH (title,body) AGAINST ('Security implications of running MySQL as root' IN NATURAL LANGUAGE MODE) AS score FROM articles WHERE MATCH (title,body) AGAINST ('Security implications of running MySQL as root' IN NATURAL LANGUAGE MODE);包含在("")中字符中的會被分解為單詞,然后在全文索引中進行搜索,簡單的說,就是進行OR查詢。
查詢-使用布爾模式(強大的語法)使用布爾模式需要指定IN BOOLEAN MODE,不會自動根據相關性排序,一些字符具有特殊的含義,例如可以通過+或-表示一個單詞必須存在或不存在。
下面的sql語句代表查詢必須 包含MySQL但不包含YourSQL
語法:
示例:
查詢-使用擴展模式當搜索短語很短時非常有用,例如搜索database可能意味著MySQL、Oracle、DB2、RDBMS都要被匹配到,這就是這個模式能做的。
添加WITH QUERY EXPANSION或?IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION啟用,它會執行兩次檢索,第一次使用給定短語檢索,第二次是結合第一次相關性比較高的行進行檢索。
例如下面的例子:
可以看到第二條語句找到了包含MySQL的行,即使該行不包含database,但是因為在第一次的搜索中搜索引擎判斷MySQL和database的相關性比較高,所以在執第二次搜索的時候返回了。
注意事項只能在類型為CHAR、VARCHAR或者TEXT的字段上創建全文索引
MATCH (字段) AGAINST (關鍵詞),必須和創建時的字段一起,例如MATCH (light,weight,baby)使用的字段名與全文索引muscle(light,weight,baby)定義的字段名一致。如果只對單個字段查詢,需要分別創建全文索引
全文索引是以詞為基礎的,innodb_ft_min_token_size和innodb_ft_max_token_size用來設置單詞的最大和最小長度,不在這個長度區間的將忽略
在停用詞stopwords中的將被忽略
如果要導入大量數據,先導入數據再建全文索引,比先建全文索引再導入數據的方式快很多
在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,MySQL 5.7.6后內置了ngram全文解析器,支持中文、日文、韓文分詞。
End.
作者:無涯
來源:博客園
本文為轉載分享,如有侵權請聯系后臺刪除
·?愛數據每周免費直播?·
直播主題:留學生:海歸如何做好職業生涯規劃?
直播內容:
“四大”等咨詢公司和外企是不是優選?
留學生如何放大優勢?
如何更好的適應國內的工作環境?
直播時間:6月24日??周三晚20:30準時直播分享
總結
以上是生活随笔為你收集整理的mysql 中文字段名_MySQL全文索引怎么做?| 教程分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天回航天自主研发的两款可重复使用发动机点
- 下一篇: leftjoin多个on条件_MYSQL