国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于MySQL的中文全文搜索研究

2017-12-15 19:31吳東明王麗娟
電腦知識與技術(shù) 2017年32期
關(guān)鍵詞:全文檢索

吳東明+王麗娟

摘要:隨著網(wǎng)絡(luò)數(shù)據(jù)庫應用的發(fā)展,用戶對數(shù)據(jù)查詢速度的要求也越來越高了,為了從海量文字信息中快速找到所需的相關(guān)信息,很多應用系統(tǒng)都通過全文檢索技術(shù)來提高系統(tǒng)的檢索效率。MySQL5.7.6之后內(nèi)置了n-gram parser全文檢索插件,用來支持中文分詞,實現(xiàn)中文全文檢索,能夠支持百萬級數(shù)據(jù)的檢索。該文將針對全文索引創(chuàng)建的注意事項、中文全文檢索的特點和應用進行簡單的介紹。

關(guān)鍵詞:n-gram parser;FULLTEXT INDEX;全文檢索

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)32-0007-02

全文搜索通常用于基于WEB的應用程序(用來搜索網(wǎng)站、產(chǎn)品目錄、新聞和其他數(shù)據(jù))、文檔管理系統(tǒng)以及自定義應用程序,以便于對存儲在MySQL數(shù)據(jù)庫中的數(shù)據(jù)提供文本搜索功能。MySQL支持對表中基于純字符的數(shù)據(jù)執(zhí)行全文查詢,全文查詢可以包括詞和短語,或者詞或短語的多種形式。

全文搜索可以對數(shù)據(jù)庫中文本數(shù)據(jù)的查詢創(chuàng)建全文索引,從而提高查詢效率。MySQL在高并發(fā)連接、數(shù)據(jù)庫記錄數(shù)較多的情況下,對數(shù)百萬行文本執(zhí)行l(wèi)ike查詢的全文搜索方式效率差,因為以通配符%開頭查詢的時候是不能利用索引的,需要從第一條記錄遍歷至最后一條記錄,對數(shù)據(jù)庫的壓力很大,可能會導致數(shù)據(jù)庫崩潰。但對于同樣的數(shù)據(jù),全文搜索只需要幾秒或更少的時間。并且與僅適用于字符模式的like謂詞不同,全文搜索可以根據(jù)特定語言的規(guī)則和短語進行操作,針對數(shù)據(jù)執(zhí)行語言搜索,從而提高了性能和效率。

MySQL全文索引是專門為了解決模糊查詢提供的,在很早的版本就已經(jīng)支持全文檢索了,只是只支持英文的全文檢索,從MySQL 5.7.6之后內(nèi)置了n-gram parser全文檢索插件,用來支持中文分詞,并且對MyISAM和InnoDB引擎都有效,在全文索引中,n-gram就是一段文字里面連續(xù)的n個字的序列。

1 設(shè)置必要的參數(shù)

在使用中文檢索分詞插件n-gram之前,可以在mysql的配置文件my.cnf(linux操作系統(tǒng))或my.ini(windows操作系統(tǒng))中設(shè)置分詞的大小。

[mysqld]

ngram_token_size=2

設(shè)置完成后,需要重啟MySQL服務(wù)。ngram_token_size=2是將分詞大小設(shè)置為2,分詞的值越大,索引的體積就越大,所以要根據(jù)具體數(shù)據(jù)庫的情況來設(shè)置合適的分詞大小。全局變量默認為2,可以在1到10之間。對于分詞大小的檢查,因為有了ngram_token_size,所以,innodb_ft_min_token_size和innodb_ft_max_token_size將不適用于n-gram。

2 創(chuàng)建全文索引

N-gram parser是默認加載到MySQL中并可以直接使用的,只需要在DDL(數(shù)據(jù)定義語言)中創(chuàng)建全文索引時使用WITH PARSER ngram,n-gram parser在MYSQL5.7.6及更高的版本可以運行。

2.1 在創(chuàng)建表的時候添加全文索引

CREATE TABLE bookinfo(

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

bookname VARCHAR(50),

content TEXT,

FULLTEXT(bookname,content) WITH PARSER ngram);

2.2 使用ALTER TABLE語句在已經(jīng)存在的表上創(chuàng)建全文索引

在修改表的時候添加全文索引

ALTER TABLE bookinfo ADD FULLTEXT INDEX ft_booknamecontent (bookname,content) WITH PARSER ngram;

2.3 使用CREATE FULLTEXT INDEX語句在已經(jīng)創(chuàng)建的表上創(chuàng)建全文索引

CREATE FULLTEXT INDEX ft_booknamecontent ON bookinfo(bookname,content) WITH PARSER ngram;

3 檢索方式

全文檢索語法:

MATCH (column1,column2,...) AGAINST (要查找的內(nèi)容 [search_modifier])

search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }

MATCH:創(chuàng)建全文索引的列(必須是char、varchar或text數(shù)據(jù)類型)。

AGAINST:要查找的內(nèi)容。

search_modifier:語言的檢索模式,包括以下三種:

3.1 自然語言檢索模式(NATURAL LANGUAGE MODE)

MySQL全文檢索的默認模式,即IN NATURAL LANGUAGE MODE可以省略不寫。自然語言搜索模式的特點:

(1) 忽略停詞(stopword),停詞類似于SQL Server全文檢索中的“干擾詞”或“終止詞”,用于在分詞時忽略常見的不重要的詞,用來去掉那些經(jīng)常出現(xiàn)但對搜索沒有幫助的詞,所以搜索這些不會獲得任何結(jié)果。

(2) 剔除一半記錄以上都有的詞,如果某個詞在數(shù)據(jù)集中頻繁出現(xiàn)的幾率超過了50%,也會被認為是停詞。

(3) 搜索結(jié)果都是具有相關(guān)性的數(shù)據(jù),返回結(jié)果自動按相關(guān)性由高到低排序。

例:使用中文全文檢索查詢出bookinfo表中包含事務(wù)或全文檢索的書籍信息。endprint

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) 全文檢索');

其中空格表示or,即檢索的行只要包含“事務(wù)”和“全文檢索”兩個關(guān)鍵詞之一就被顯示結(jié)果。

或者:

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) 全文檢索' IN NATURAL LANGUAGE MODE);

3.2 布爾檢索模式(BOOLEAN MODE)

布爾查找模式?jīng)]有自然語言搜索模式中的50%的規(guī)則,即便有詞語在數(shù)據(jù)集中頻繁出現(xiàn)的幾率超過了50%,也會被作為搜索目標進行檢索并返回結(jié)果,而且檢索時單詞的局部匹配也會被作為目標進行檢索。

查詢的結(jié)果是不會自動以相關(guān)性進行排序,可以對沒有設(shè)置為全文索引的字段進行搜索,但是速度會非常慢。

布爾全文檢索支持的操作符:

(1) “+”:必須包含指定的關(guān)鍵詞,不包含該關(guān)鍵詞的記錄均被忽略。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) +全文檢索' IN BOOLEAN MODE);

檢索出的記錄必須包含“全文檢索”關(guān)鍵詞。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) +全文檢索' IN BOOLEAN MODE);

檢索出的記錄必須包含“全文檢索”和“事務(wù)”這兩個關(guān)鍵詞。

(2) “-”:必須排除指定的關(guān)鍵詞

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) -全文檢索' IN BOOLEAN MODE);

檢索出的記錄包含“事務(wù)”關(guān)鍵詞,但是必須不能包含“全文檢索”關(guān)鍵詞。

(3) “>”:包含該關(guān)鍵詞,并且提高該條匹配數(shù)據(jù)的權(quán)重值。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) >全文檢索' IN BOOLEAN MODE);

檢索出的記錄會提高“全文檢索”關(guān)鍵詞的權(quán)重,有“全文檢索”關(guān)鍵詞的記錄排在前面。

(4) “<”:包含該關(guān)鍵詞,并且降低該條匹配數(shù)據(jù)的權(quán)重值。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) <全文檢索' IN BOOLEAN MODE);

檢索出的記錄會降低“全文檢索”關(guān)鍵詞的權(quán)重,有“全文檢索”關(guān)鍵詞的記錄排在后面。

(5) “~”將其相關(guān)性由正轉(zhuǎn)負,表示擁有該關(guān)鍵詞會降低相關(guān)性(但不像“-”將之排除),只是權(quán)重值降低排在查詢顯示結(jié)果的后面。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('事務(wù) ~全文檢索' IN BOOLEAN MODE);

檢索出的記錄會包含“全文檢索”關(guān)鍵詞,但是 “全文檢索”關(guān)鍵詞的相關(guān)性由正轉(zhuǎn)負,但是查詢結(jié)果不排除包含此關(guān)鍵詞的記錄,只是顯示給用戶時排列在后面。

(6) “*”:放在關(guān)鍵詞尾部的通配符。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('全文*' IN BOOLEAN MODE);

檢索出包含“全文”的所有記錄。

3.3 查詢擴展檢索模式(WITH QUERY WXPANSION)

當搜索短語太短時,查詢擴展檢索是很有用的。先用IN NATURAL LANGUAGE MODE檢索,然后把相關(guān)的記錄中的詞添加到查詢字符串中進行二次自然語言檢索,返回查詢得到的結(jié)果??梢栽谒阉鳌皵?shù)據(jù)庫”關(guān)鍵詞時查詢出“MySQL”、“Oracle”、“DB2”等。第一次查詢“數(shù)據(jù)庫”得到一些結(jié)果,從這些結(jié)果中抽取字符串,得到MySQL、oracle、DB2等幾率相當高,最后用“數(shù)據(jù)庫”關(guān)鍵詞和這些抽取出來的字符串再做一次查詢。

當無法拼出正確的字符串時,第一次用相似的錯誤字符串進行查詢,這時很有可能得到正確的字符串,再用正確的字符串得到想要的查詢結(jié)果。

SELECT * FROM bookinfo WHERE MATCH(bookname,content) AGAINST('數(shù)據(jù)庫' WITH QUERY EXPANSION) ;

檢索出所有與“數(shù)據(jù)庫”關(guān)鍵詞相關(guān)的記錄,如:MySQL、DB2等。

4 刪除全文索引

4.1 使用ALTER TABLE刪除全文索引

ALTER TABLE bookinfo DROP INDEX ft_booknamecontent;

4.2 使用DROP INDEX刪除全文索引

DROP INDEX ft_booknamecontent ON bookinfo;

5 注意事項

1) 創(chuàng)建中文全文索引必須加上with parser ngram。

2) 只能檢索被全文索引的那些列,即MATCH()函數(shù)中的列必須與創(chuàng)建FULLTEXT索引時的列相同。如MATCH(bookname,content)與FULLTEXT(bookname,content)。若要對索引的多列進行其中某一列的查找時,如bookname列,則必須在這一列單獨創(chuàng)建全文索引FULLTEXT(bookname),然后用MATCH(bookname)進行搜索。因此,MATCH()的字段列表一定不能跨表。

3) 默認 MATCH...AGAINST (以自然語言檢索模式檢索)是以相關(guān)性排序,由高到低。

4) 全文索引對于insert、update、delete數(shù)據(jù)更新操作都很慢。

6 結(jié)束語

中文全文檢索是從MySQL5.7.6之后內(nèi)置了n-gram parser全文檢索插件后支持的,本文簡單介紹了分詞大小的設(shè)置、全文索引的創(chuàng)建、中文全文索引的應用以及一些相關(guān)的注意事項,中文全文檢索在檢索海量數(shù)據(jù)的時候,不僅能提高效率,而且提高了查詢的準確性。

參考文獻:

[1] 曾歡.數(shù)據(jù)庫全文檢索方法研究及其應用[D].大連理工大學,2011(11).

[2] 肖文輝.基于MySQL的全文檢索系統(tǒng)的研究與引用[J].計算機與信息技術(shù),2008(6).

[3] 楊寶昌.讓MySQL支持中文全文檢索[J].計算機世界,2006(9).endprint

猜你喜歡
全文檢索
實名制校園安保服務(wù)平臺的設(shè)計與實現(xiàn)
Oracle數(shù)據(jù)庫全文檢索性能研究
基于KySou的全文檢索系統(tǒng)的分析與優(yōu)化
用JSP調(diào)用Lucene包來實現(xiàn)全文檢索
永嘉县| 东丰县| 弥勒县| 阿坝县| 柘荣县| 甘德县| 连平县| 铁力市| 巩义市| 富锦市| 衡阳市| 林周县| 彭水| 长阳| 洛扎县| 柞水县| 丘北县| 定安县| 竹山县| 昌邑市| 海宁市| 锡林郭勒盟| 静乐县| 清涧县| 临朐县| 台安县| 巴林左旗| 开远市| 盐山县| 田阳县| 镇沅| 瑞安市| 昭觉县| 台东市| 绍兴市| 梁平县| 紫阳县| 商洛市| 通江县| 舞阳县| 平邑县|