Mysql關(guān)系型數(shù)據(jù)庫管理系統(tǒng)
mysql是一個(gè)開放源碼的小型關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典mysql ab公司。mysql被廣泛地應(yīng)用在internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了mysql作為網(wǎng)站數(shù)據(jù)庫。
InnoDB默認(rèn)的全文索引parser非常合適于Latin,因?yàn)長(zhǎng)atin是通過空格來分詞的。但對(duì)于像中文,日文和韓文來說,沒有這樣的分隔符。一個(gè)詞可以由多個(gè)字來組成,所以我們需要用不同的方式來處理。在MySQL 5.7.6中我們能使用一個(gè)新的全文索引插件來處理它們:n-gram parser。
前言
其實(shí)全文檢索在MySQL里面很早就支持了,只不過一直以來只支持英文。緣由是他從來都使用空格來作為分詞的分隔符,而對(duì)于中文來講,顯然用空格就不合適,需要針對(duì)中文語義進(jìn)行分詞。這不,從MySQL 5.7開始,MySQL內(nèi)置了ngram全文檢索插件,用來支持中文分詞,并且對(duì)MyISAM和InnoDB引擎有效。
在使用中文檢索分詞插件ngram之前,先得在MySQL配置文件里面設(shè)置他的分詞大小,比如,
[mysqld] ngram_token_size=2
這里把分詞大小設(shè)置為2。要記住,分詞的SIZE越大,索引的體積就越大,所以要根據(jù)自身情況來設(shè)置合適的大小。
示例表結(jié)構(gòu):
CREATE?TABLE?articles?( ???id?INTUNSIGNED?AUTO_INCREMENT?NOT?NULL?PRIMARY?KEY, ???titleVARCHAR(200), ???body?TEXT, ???FULLTEXT?(title,body)?WITH?PARSER?ngram ??)?ENGINE=InnoDBCHARACTER?SET?utf8mb4;
示例數(shù)據(jù),有6行記錄。
mysql>?select?*?from?articlesG ***************************1.?row?*************************** ??id:?1 title:?數(shù)據(jù)庫管理 ?body:?在本教程中我將向你展示如何管理數(shù)據(jù)庫 ***************************2.?row?*************************** ??id:?2 title:?數(shù)據(jù)庫應(yīng)用開發(fā) ?body:?學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序 ***************************3.?row?*************************** ??id:?3 title:?MySQL完全手冊(cè) ?body:?學(xué)習(xí)MySQL的一切 ***************************4.?row?*************************** ??id:?4 title:?數(shù)據(jù)庫與事務(wù)處理 ?body:?系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論 ***************************5.?row?*************************** ??id:?5 title:?NoSQL精髓 ?body:?學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫 ***************************6.?row?*************************** ??id:?6 title:?SQL?語言詳解 ?body:?詳細(xì)了解如果使用各種SQL 6?rows?inset?(0.00?sec)
顯式指定全文檢索表源
mysql>?SETGLOBAL?innodb_ft_aux_table="new_feature/articles"; Query?OK,?0?rows?affected?(0.00?sec)
通過系統(tǒng)表,就可以查看到底是怎么劃分articles里的數(shù)據(jù)。
mysql>?SELECT?*FROM?information_schema.INNODB_FT_INDEX_CACHE?LIMIT?20,10; +------+--------------+-------------+-----------+--------+----------+ |?WORD?|?FIRST_DOC_ID?|?LAST_DOC_ID?|?DOC_COUNT?|?DOC_ID|?POSITION?| +------+--------------+-------------+-----------+--------+----------+ |?中我?|???2?|???2?|???1?|??2?|??28?| |?習(xí)m?|???4?|???4?|???1?|??4?|??21?| |?習(xí)了?|???6?|???6?|???1?|??6?|??16?| |?習(xí)開?|???3?|???3?|???1?|??3?|??25?| |?習(xí)數(shù)?|???5?|???5?|???1?|??5?|??37?| |?了解?|???6?|???7?|???2?|??6?|??19?| |?了解?|???6?|???7?|???2?|??7?|??23?| |?事務(wù)?|???5?|???5?|???1?|??5?|??12?| |?事務(wù)?|???5?|???5?|???1?|??5?|??40?| |?何管?|???2?|???2?|???1?|??2?|??52?| +------+--------------+-------------+-----------+--------+----------+ 10?rows?in?set?(0.00?sec)
這里可以看到,把分詞長(zhǎng)度設(shè)置為2,所有的數(shù)據(jù)都只有兩個(gè)一組。上面數(shù)據(jù)還包含了行的位置,ID等等信息。
接下來,我來進(jìn)行一系列檢索示范,使用方法和原來英文檢索一致。
一、自然語言模式下檢索:
1、得到符合條件的個(gè)數(shù),
mysql>SELECT?COUNT(*)?FROM?articles ->?WHERE?MATCH?(title,body)?AGAINST?('數(shù)據(jù)庫'?IN?NATURALLANGUAGE?MODE); +----------+ |?COUNT(*)?| +----------+ |??4?| +----------+ 1?row?in?set?(0.05?sec)
2、得到匹配的比率,
mysql>SELECT?id,?MATCH?(title,body)?AGAINST?('數(shù)據(jù)庫'?IN?NATURAL?LANGUAGE?MODE) ?AS?score?FROM?articles; +----+----------------------+ |?id|?score????| +----+----------------------+ |?1?|?0.12403252720832825?| |?2?|?0.12403252720832825?| |?3?|?????0?| |?4?|?0.12403252720832825?| |?5?|?0.062016263604164124| |?6?|?????0?| +----+----------------------+ 6rows?in?set?(0.00?sec)
二、布爾模式下搜索,這個(gè)就相對(duì)于自然模式搜索來的復(fù)雜些:
1、匹配既有管理又有數(shù)據(jù)庫的記錄,
mysql>?SELECT?*?FROM?articles?WHERE?MATCH?(title,body) ??->??AGAINST?('+數(shù)據(jù)庫?+管理'?IN?BOOLEAN?MODE); +----+------------+--------------------------------------+ |?id|?title??|?body?????????| +----+------------+--------------------------------------+ |?1?|?數(shù)據(jù)庫管理?|?在本教程中我將向你展示如何管理數(shù)據(jù)庫??| +----+------------+--------------------------------------+ 1?rowin?set?(0.00?sec)
2、匹配有數(shù)據(jù)庫,但是沒有管理的記錄,
mysql>?SELECT?*?FROM?articles?WHERE?MATCH?(title,body) ??->??AGAINST?('+數(shù)據(jù)庫?-管理'?IN?BOOLEAN?MODE); +----+------------------+----------------------------+ |?id|?title????|?body??????| +----+------------------+----------------------------+ |?2?|?數(shù)據(jù)庫應(yīng)用開發(fā)??|?學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序???| |?4?|?數(shù)據(jù)庫與事務(wù)處理?|?系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論??| |?5?|?NoSQL?精髓??|?學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫??| +----+------------------+----------------------------+ 3?rows?in?set?(0.00?sec)
3、匹配MySQL,但是把數(shù)據(jù)庫的相關(guān)性降低,
mysql>?SELECT?*?FROM?articles?WHERE?MATCH?(title,body) ??->??AGAINST?('>數(shù)據(jù)庫?+MySQL'?INBOOLEAN?MODE); +----+---------------+-----------------+ |?id|?title???|?body???| +----+---------------+-----------------+ |?3?|?MySQL完全手冊(cè)?|學(xué)習(xí)MySQL的一切?| +----+---------------+-----------------+ 1?rowin?set?(0.00?sec)
三、查詢擴(kuò)展模式,比如要搜索數(shù)據(jù)庫,那么MySQL,oracle,DB2也都將會(huì)被搜索到,
mysql>?SELECT?*?FROM?articles ??->??WHERE?MATCH?(title,body) ??->??AGAINST?('數(shù)據(jù)庫'?WITH?QUERY?EXPANSION); +----+------------------+--------------------------------------+ |?id|?title???|?body?????????| +----+------------------+--------------------------------------+ |?1?|?數(shù)據(jù)庫管理??|?在本教程中我將向你展示如何管理數(shù)據(jù)庫??| |?4?|?數(shù)據(jù)庫與事務(wù)處理?|?系統(tǒng)的學(xué)習(xí)數(shù)據(jù)庫的事務(wù)概論????| |?2?|?數(shù)據(jù)庫應(yīng)用開發(fā)??|?學(xué)習(xí)開發(fā)數(shù)據(jù)庫應(yīng)用程序?????| |?5?|?NoSQL?精髓??|?學(xué)習(xí)了解各種非結(jié)構(gòu)化數(shù)據(jù)庫????| |?6?|?SQL?語言詳解??|?詳細(xì)了解如果使用各種SQL?????| |?3?|?MySQL完全手冊(cè)??|?學(xué)習(xí)MySQL的一切??????| +----+------------------+--------------------------------------+ 6?rows?in?set?(0.01?sec)
當(dāng)然,我這里只是功能演示,更多的性能測(cè)試,大家有興趣可以進(jìn)行詳細(xì)測(cè)試。由于N-grm是中文檢索常用的分詞算法,已經(jīng)在互聯(lián)網(wǎng)大量使用,這次集成到MySQL中,想必效果上不會(huì)有太大的問題。
以上就是深度解析MySQL 5.7之中文全文檢索的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!