時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
全文索引在 MySQL 中是一個 FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創(chuàng)建。對于大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個沒有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 創(chuàng)建索引,這將是非??斓?。將數(shù)據(jù)裝載到一個已經(jīng)有 FULLTEXT 索引的表中,將是非常慢的。
全文搜索通過 MATCH() 函數(shù)完成:
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO articles VALUES
-> (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
-> (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
-> (NULL,'Optimising MySQL','In this tutorial we will show ...'),
-> (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-> (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
-> (NULL,'MySQL Security', 'When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
函數(shù) MATCH() 對照一個文本集(包含在一個 FULLTEXT 索引中的一個或多個列的列集)執(zhí)行一個自然語言搜索一個字符串。搜索字符串做為 AGAINST() 的參數(shù)被給定。搜索以忽略字母大小寫的方式執(zhí)行。對于表中的每個記錄行,MATCH() 返回一個相關(guān)性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。
當(dāng) MATCH() 被使用在一個 WHERE 子句中時 (參看上面的例子),返回的記錄行被自動地以相關(guān)性從高到底的次序排序。相關(guān)性值是非負的浮點數(shù)字。零相關(guān)性意味著不相似。相關(guān)性的計算是基于:詞在記錄行中的數(shù)目、在行中唯一詞的數(shù)目、在集中詞的全部數(shù)目和包含一個特殊詞的文檔(記錄行)的數(shù)目。
它也可以執(zhí)行一個邏輯模式的搜索。這在下面的章節(jié)中被描述。
前面的例子是函數(shù) MATCH() 使用上的一些基本說明。記錄行以相似性遞減的順序返回。 下一個示例顯示如何檢索一個明確的相似性值。如果即沒有 WHERE 也沒有 ORDER BY 子句,返回行是不排序的。
mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
| 1 | 0.64840710366884 |
| 2 | 0 |
| 3 | 0.66266459031789 |
| 4 | 0 |
| 5 | 0 |
| 6 | 0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
下面的示例更復(fù)雜一點。查詢返回相似性并依然以相似度遞減的次序返回記錄行。為了完成這個結(jié)果,你應(yīng)該指定 MATCH() 兩次。這不會引起附加的開銷,因為 MySQL 優(yōu)化器會注意到兩次同樣的 MATCH() 調(diào)用,并只調(diào)用一次全文搜索代碼。
mysql> SELECT id, body, MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root') AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body | score |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
| 6 | When configured properly, MySQL ... | 1.31140957288 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
MySQL 使用一個非常簡單的剖析器來將文本分隔成詞。一個"詞"是由文字、數(shù)據(jù)、"'" 和 "_" 組成的任何字符序列。任何在 stopword 列表上出現(xiàn)的,或太短的(3 個字符或更少的)的 "word" 將被忽略。
在集和查詢中的每個合適的詞根據(jù)其在集與查詢中的重要性衡量。這樣,一個出現(xiàn)在多個文檔中的詞將有較低的權(quán)重(可能甚至有一個零權(quán)重),因為在這個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個較高的權(quán)重。然后,詞的權(quán)重將被結(jié)合用于計算記錄行的相似性。
這樣一個技術(shù)工作可很好地工作與大的集(實際上,它會小心地與之諧調(diào))。 對于非常小的表,詞分類不足以充份地反應(yīng)它們的語義值,有時這個模式可能產(chǎn)生奇怪的結(jié)果。
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)
在上面的例子中,搜索詞 MySQL 卻沒有得到任何結(jié)果,因為這個詞在超過一半的記錄行中出現(xiàn)。同樣的,它被有效地處理為一個 stopword (即,一個零語義值的詞)。這是最理想的行為 -- 一個自然語言的查詢不應(yīng)該從一個 1GB 的表中返回每個次行(second row)。
匹配表中一半記錄行的詞很少可能找到相關(guān)文檔。實際上,它可能會發(fā)現(xiàn)許多不相關(guān)的文檔。我們都知道,當(dāng)我們在互聯(lián)網(wǎng)上通過搜索引擎試圖搜索某些東西時,這會經(jīng)常發(fā)生。因為這個原因,在這個特殊的數(shù)據(jù)集中,這樣的行被設(shè)置一個低的語義值。
到 4.0.1 時,MySQL 也可以使用 IN BOOLEAN MODE 修飾語來執(zhí)行一個邏輯全文搜索。
mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+------------------------------+-------------------------------------+
| id | title | body |
+----+------------------------------+-------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL Efficiently | After you went through a ... |
| 3 | Optimising MySQL | In this tutorial we will show ... |
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+------------------------------+-------------------------------------+
這個查詢返回所有包含詞 MySQL 的記錄行(注意: 50% 的閾值沒有使用),但是它沒有包含詞 YourSQL。注意,一個邏輯模式的搜索不會自動地以相似值的降序排序記錄行。你可以從上面的結(jié)果出看得出來,最高的相似值(包含 MySQL 兩次的那個) 最列在最后,而不是第一位。一個邏輯全文搜索即使在沒有一個 FULLTEXT 索引的情況下也可以工作,然而它慢些。
邏輯全文搜索支持下面的操作符:"+" 一個領(lǐng)頭的加號表示,該詞必須出現(xiàn)在每個返回的記錄行中,"-" 一個領(lǐng)頭的減號表示,該詞必須不出現(xiàn)在每個返回的記錄行中。
缺省的 (當(dāng)既沒有加號也沒有負號被指定時)詞是隨意的,但是包含它的記錄行將被排列地更高一點。這個模仿沒有 IN BOLEAN MODE 修飾詞的 MATCH() ... AGAINST() 的行為。
< > 這兩個操作符用于改變一個詞的相似性值的基值。< 操作符減少基值,> 操作符則增加它。參看下面的示例。
( ) 圓括號用于對子表達式中的詞分組。
~一個領(lǐng)頭的否定號的作用象一個否定操作符,引起行相似性的詞的基值為負的。它對標(biāo)記一個噪聲詞很有用。一個包含這樣的詞的記錄將被排列得低一點,但是不會被完全的排除,因為這樣可以使用 - 操作符。
* 一個星號是截斷操作符。不想其它的操作符,它應(yīng)該被追加到一個詞后,不加在前面。
" 短語,被包圍在雙引號"中,只匹配包含這個短語(字面上的,就好像被鍵入的)的記錄行。
這里是一些示例:
apple banana
找至少包含上面詞中的一個的記錄行
1.+apple +juice ... 兩個詞均在被包含
2.+apple macintosh ... 包含詞 "apple",但是如果同時包含 "macintosh",它的排列將更高一些
3.+apple -macintosh ... 包含 "apple" 但不包含 "macintosh"
4.+apple +(>pie 5.apple* ... 包含 "apple","apples","applesauce" 和 "applet"
6."some words"
關(guān)鍵詞標(biāo)簽:MySQL,數(shù)據(jù)庫
相關(guān)閱讀
熱門文章 詳細介紹查詢優(yōu)化技術(shù)在現(xiàn)實系統(tǒng)中的運用 教你在MySQL 5.0以上版本中配置主從庫 適宜做簡單搜索的MySQL數(shù)據(jù)庫全文索引 如何在Unix系統(tǒng)環(huán)境下安裝MySQL數(shù)據(jù)庫
人氣排行 配置高可用性的MySQL服務(wù)器負載均衡群集 教你在MySQL 5.0以上版本中配置主從庫 個人經(jīng)驗總結(jié):完全卸載MySQL數(shù)據(jù)庫5.0 適宜做簡單搜索的MySQL數(shù)據(jù)庫全文索引 MySQL環(huán)境下導(dǎo)入數(shù)據(jù)時是否需要禁用索引 講解MaxDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的主要差別 數(shù)據(jù)庫應(yīng)用經(jīng)驗:如何簡單安裝MySQL數(shù)據(jù)庫 如何在Unix系統(tǒng)環(huán)境下安裝MySQL數(shù)據(jù)庫