MySQL:詳細說明MySQL全文檢索圖文詳細教程
發(fā)表時間:2023-07-28 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]軟件等級:更新時間:2016-11-11版本號:v5.7.10 MySQL Server x64官方正式版免費下載立即下載MySQL:詳解MySQL全文檢索教程 Memory所有數(shù)據(jù)置于...
MySQL:詳解MySQL全文檢索教程
Memory所有數(shù)據(jù)置于內(nèi)存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數(shù)據(jù)量成正比的內(nèi)存空間。并且其內(nèi)容會在Mysql重新啟動時丟失 。。。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi)。這樣就增加了速度并提高了靈活性。MySQL的SQL“結(jié)構(gòu)化查詢語言”。SQL是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL軟件采用了GPL(GNU通用公共許可證)。
Merge將一定數(shù)量的MyISAM表聯(lián)合而成一個整體,在超大規(guī)模數(shù)據(jù)存儲時很有用。。。。
1. MySQL 4.x版本及以上版本提供了全文檢索支持,但是表的存儲引擎類型必須為MyISAM,以下是建表SQL,注意其中顯式設(shè)置了存儲引擎類型
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 其中FULLTEXT(title, body) 給title和body這兩列建立全文索引,之后檢索的時候注意必須同時指定這兩列。
2. 插入測試數(shù)據(jù)
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 ...');
3. 全文檢索測試
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('database'); 檢索結(jié)果如下:
5 MySQL vs. YourSQL In the following database comparison ...1 MySQL Tutorial DBMS stands for DataBase ... 說明全文匹配時忽略大小寫。
4. 可能遇到的困擾
到目前為止都很順利,但是如果檢索SQL改為下面會怎樣呢?
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('well'); 結(jié)果讓人大跌眼鏡,開始我也困惑了許久,后來去網(wǎng)上查了下才知道原來是這么回事:
mysql指定了最小字符長度,默認是4,必須要匹配大于4的才會有返回結(jié)果,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 來查看指定的字符長度,也可以在mysql配置文件my.ini 更改最小字符長度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重啟mysql即可。 所以上面不能返回結(jié)果。但是我用上面的方法改配置文件后,再用show命令查看,并沒有改變。
另外,MySQL還會計算一個詞的權(quán)值,以決定是否出現(xiàn)在結(jié)果集中,具體如下:
mysql在集和查詢中的對每個合適的詞都會先計算它們的權(quán)重,一個出現(xiàn)在多個文檔中的詞將有較低的權(quán)重(可能甚至有一個零權(quán)重),因為在這個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個較高的權(quán)重,mysql默認的閥值是50%,上面‘you’在每個文檔都出現(xiàn),因此是100%,只有低于50%的才會出現(xiàn)在結(jié)果集中。 但是如果不考慮權(quán)重,那么該怎么辦呢?MySQL提供了布爾全文檢索(BOOLEAN FULLTEXT SEARCH)
假設(shè)well在所有記錄中都出現(xiàn),并且ft_min_word_len已經(jīng)改為2,那么下面的SQL檢索語句得到的結(jié)果集將包含所有記錄:
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('well');
5. 布爾全文檢索語法
上面通過IN BOOLEAN MODE指定全文檢索模式為布爾全文檢索。MySQL還提供了一些類似我們平時使用搜索引擎時用到的的語法:邏輯與、邏輯或、邏輯非等。具體通過幾個SQL語句例子來說明
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+apple -banana' IN BOOLEAN MODE); + 表示AND,即必須包含。- 表示NOT,即不包含。
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('apple banana' IN BOOLEAN MODE); apple和banana之間是空格,空格表示OR,即至少包含apple、banana中的一個。
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+apple banana' IN BOOLEAN MODE); 必須包含apple,但是如果同時也包含banana則會獲得更高的權(quán)重。
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+apple ~banana' IN BOOLEAN MODE); ~ 是我們熟悉的異或運算符。返回的記錄必須包含apple,但是如果同時也包含banana會降低權(quán)重。但是它沒有 +apple -banana 嚴格,因為后者如果包含banana壓根就不返回。
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+apple +(>banana
6. MySQL不支持中文的全文檢索
默認MySQL不支持中文全文檢索,怎么辦?大致方法有下面幾個:
A. 擴展MySQL,添加中文全文檢索支持,難度較大
B. 為中文內(nèi)容表提供一個對應(yīng)的英文索引表(即將FULLTEXT索引列按照一定的規(guī)則轉(zhuǎn)化成英文索引表中的每一條記錄,比如全部進行base64編碼,內(nèi)容表和英文索引表的id相同),檢索時先將檢索詞也用相同規(guī)則轉(zhuǎn)換成英文,然后再使用。如果還要支持按拼音全文檢索,那么還需要在索引表中增加對應(yīng)的拼音內(nèi)容(就需要中文轉(zhuǎn)拼音算法了)。當然如果還需要支持中英文交互搜索,比如搜索William時也需要返回威廉,反之亦然,那么還需要將威廉對應(yīng)的英文翻譯也存到索引表中去。
參考網(wǎng)上的鏈接,具體做法包括先對中文內(nèi)容進行分詞,然后中文轉(zhuǎn)換為四位區(qū)位碼存到索引表中。檢索時,包含中文的檢索詞也要先分詞,再轉(zhuǎn)換為四位區(qū)位碼,然后在索引表中進行全文檢索。
7. 核對條目
A. 只有存儲引擎類型為MyISAM類型的表,并且MySQL版本為4.X或者以上才能使用MySQL內(nèi)置的全文檢索支持
B. MySQL全文檢索默認不支持中文,且對英文檢索時忽略大小寫
C. MySQL全文檢索時,默認檢索長度為4,即關(guān)鍵詞的長度必須大于5才能被捕獲
D. MySQL全文檢索時,所有FULLTEXT索引列必須使用相同的字符集
E. MySQL全文檢索返回結(jié)果集時還會考慮權(quán)重
F. MySQL全文檢索還支持靈活的布爾全文檢索模式
G. 更多內(nèi)容參考MySQL5官方手冊
EXAMPLE存儲引擎是一個不做任何事情的存根引擎。它的目的是作為MySQL源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發(fā)者。EXAMPLE存儲引擎不支持編索引。
另外,Mysql的存儲引擎接口定義良好。有興趣的開發(fā)者可以通過閱讀文檔編寫自己的存儲引擎。唯一索引可以保證數(shù)據(jù)記錄的唯一性。事實上,在許多場合,人們創(chuàng)建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數(shù)據(jù)出現(xiàn)重復(fù)。
學習教程快速掌握從入門到精通的電腦知識