深度解析MySQL 5.7之中文全文檢索

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)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享