基於mysql全文索引的深入理解

來源:互聯網
上載者:User

前言:本文簡單講述全文索引的應用執行個體,MYSQL示範版本5.5.24。
Q:全文索引適用於什麼場合?
A:全文索引是目前實現大資料搜尋的關鍵技術。
至於更詳細的介紹請自行百度,本文不再闡述。
--------------------------------------------------------------------------------
一、如何設定?

點擊結尾處的{全文檢索搜尋}即可設定全文索引,不同MYSQL版本名字可能不同。

二、設定條件
1.表的儲存引擎是MyISAM,預設儲存引擎InnoDB不支援全文索引(新版本MYSQL5.6的InnoDB支援全文索引)
2.欄位類型:char、varchar和text

三、配置
my.ini設定檔中添加
# MySQL全文索引查詢關鍵詞最小長度限制
[mysqld]
ft_min_word_len = 1
儲存後重啟MYSQL,執行SQL語句

複製代碼 代碼如下:SHOW VARIABLES

查看ft_min_word_len是否設定成功,如果沒設定成功請確保
1.確認my.ini正確配置,注意不要搞錯my.ini的位置
2.確認mysql已經重啟,實在不行重啟電腦
其他相關配置請自行百度。
註:重新設定配置後,已經設定的索引需要重新設定產生索引

四、SQL文法
首先產生temp表
複製代碼 代碼如下:CREATE TABLE IF NOT EXISTS `temp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`char` char(50) NOT NULL,
`varchar` varchar(50) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `char` (`char`),
FULLTEXT KEY `varchar` (`varchar`),
FULLTEXT KEY `text` (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `temp` (`id`, `char`, `varchar`, `text`) VALUES
(1, 'a bc 我 知道 1 23', 'a bc 我 知道 1 23', 'a bc 我 知道 1 23');

搜尋`char`欄位 'a' 值複製代碼 代碼如下:SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a')

但是你會發現查詢無結果?!
這時你也許會想:哎呀怎麼回事,我明明按照步驟來做的啊,是不是那裡漏了或者錯了?
你不要著急,做程式是這樣的,出錯總是有的,靜下心來,著急是不能解決問題的。

如果一個關鍵詞在50%的資料出現,那麼這個詞會被當做無效詞。
如果你想去除50%的現在請使用IN BOOLEAN MODE搜尋複製代碼 代碼如下:SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a' IN BOOLEAN MODE)

這樣就可以查詢出結果了,但是我們不推薦使用。
全文索引的搜尋模式的介紹自行百度。

我們先加入幾條無用資料已解除50%限制複製代碼 代碼如下:INSERT INTO `temp` (
`id` ,
`char` ,
`varchar` ,
`text`
)
VALUES (
NULL , '7', '7', '7'
), (
NULL , '7', '7', '7'
), (
NULL , 'a,bc,我,知道,1,23', 'a,bc,我,知道,1,23', 'a,bc,我,知道,1,23'
), (
NULL , 'x', 'x', 'x'
);

這時你執行以下SQL語句都可以查詢到資料複製代碼 代碼如下:SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('bc');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('我');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知道');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('1');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('23');

以下SQL搜尋不到資料複製代碼 代碼如下:SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('b');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('c');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('道');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('2');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('3');

如果搜尋多個詞,請用空格或者逗號隔開複製代碼 代碼如下:SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a x');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a,x');

上面的SQL都可以查詢到三條資料

五、分詞
看到這裡你應該發現我們欄位裡的值也是分詞,不能直接插入未經處理資料。
全文索引應用流程:
1.接收資料-資料分詞-入庫
2.接收資料-資料分詞-查詢
現在有個重要的問題:怎麼對資料分詞?
資料分詞一般我們會使用一些成熟免費的分詞系統,當然如果你有能力也可以自己做分詞系統,這裡我們推薦使用SCWS分詞外掛程式。
首先下載
1.php_scws.dll 注意對應版本
2.XDB詞典檔案
3.規則集檔案


安裝scws
1.先建一個檔案夾,位置不限,但是最好不要中文路徑。
2.解壓{規則集檔案},把xdb、三個INI檔案全部扔到 D:\scws
3.把php_scws.dll複製到你的PHP目錄下的EXT檔案夾裡面
4.在 php.ini 的末尾加入以下幾行:
[scws]

; 注意請檢查 php.ini 中的 extension_dir 的設定值是否正確, 否則請將 extension_dir 設為空白,
; 再把 php_scws.dll 指定為絕對路徑。

extension = php_scws.dll
scws.default.charset = utf8
scws.default.fpath = "D:\scws"
5.重啟你的伺服器
測試
複製代碼 代碼如下:$str="測試中文分詞";
$so = scws_new();
$so->send_text($str);
$temp=$so->get_result();
$so->close();
var_dump($temp);

如果安裝未成功,請參照官方說明文檔
--------------------------------------------------------------------------------
這樣我們就可以使用全文索引技術了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.