溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL 4.1.0 中文參考手冊 --- 6.8 MySQL 全文搜索 (轉(zhuǎn))

發(fā)布時(shí)間:2020-08-11 07:13:11 來源:ITPUB博客 閱讀:129 作者:gugu99 欄目:MySQL數(shù)據(jù)庫
MySQL 4.1.0 中文參考手冊 --- 6.8 MySQL 全文搜索 (轉(zhuǎn))[@more@] MYSQL 4.1.0 中文參考手冊"> words" content="MySQL,4.1.0,Shuixin13,MySQL 4.1.0,中文,中文參考手冊,犬犬(心帆)"> CSS rel=STYLESHEET>

MySQL Reference Manual for version 4.1.0-alpha.


6.8 MySQL 全文搜索

到 3.23.23 時(shí),MySQL 開始支持全文索引和搜索。全文索引在 MySQL 中是一個(gè) FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時(shí)或之后使用 ALTER TABLECREATE INDEXCHAR、VARCHARTEXT 列上創(chuàng)建。對于大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個(gè)沒有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 創(chuàng)建索引,這將是非??斓摹?shù)據(jù)裝載到一個(gè)已經(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() 對照一個(gè)文本集(包含在一個(gè) FULLTEXT 索引中的一個(gè)或多個(gè)列的列集)執(zhí)行一個(gè)自然語言搜索一個(gè)字符串。搜索字符串做為 AGAINST() 的參數(shù)被給定。搜索以忽略字母大小寫的方式執(zhí)行。對于表中的每個(gè)記錄行,MATCH() 返回一個(gè)相關(guān)性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。

當(dāng) MATCH() 被使用在一個(gè) WHERE 子句中時(shí) (參看上面的例子),返回的記錄行被自動(dòng)地以相關(guān)性從高到底的次序排序。相關(guān)性值是非負(fù)的浮點(diǎn)數(shù)字。零相關(guān)性意味著不相似。相關(guān)性的計(jì)算是基于:詞在記錄行中的數(shù)目、在行中唯一詞的數(shù)目、在集中詞的全部數(shù)目和包含一個(gè)特殊詞的文檔(記錄行)的數(shù)目。

它也可以執(zhí)行一個(gè)邏輯模式的搜索。這在下面的章節(jié)中被描述。

前面的例子是函數(shù) MATCH() 使用上的一些基本說明。記錄行以相似性遞減的順序返回。

下一個(gè)示例顯示如何檢索一個(gè)明確的相似性值。如果即沒有 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ù)雜一點(diǎn)。查詢返回相似性并依然以相似度遞減的次序返回記錄行。為了完成這個(gè)結(jié)果,你應(yīng)該指定 MATCH() 兩次。這不會(huì)引起附加的開銷,因?yàn)?MySQL 優(yōu)化器會(huì)注意到兩次同樣的 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 使用一個(gè)非常簡單的剖析器來將文本分隔成詞。一個(gè)“詞”是由文字、數(shù)據(jù)、“'”“_” 組成的任何字符序列。任何在 stopword 列表上出現(xiàn)的,或太短的(3 個(gè)字符或更少的)的 “word” 將被忽略。

在集和查詢中的每個(gè)合適的詞根據(jù)其在集與查詢中的重要性衡量。這樣,一個(gè)出現(xiàn)在多個(gè)文檔中的詞將有較低的權(quán)重(可能甚至有一個(gè)零權(quán)重),因?yàn)樵谶@個(gè)特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個(gè)較高的權(quán)重。然后,詞的權(quán)重將被結(jié)合用于計(jì)算記錄行的相似性。

這樣一個(gè)技術(shù)工作可很好地工作與大的集(實(shí)際上,它會(huì)小心地與之諧調(diào))。 對于非常小的表,詞分類不足以充份地反應(yīng)它們的語義值,有時(shí)這個(gè)模式可能產(chǎn)生奇怪的結(jié)果。

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL'); Empty set (0.00 sec)


在上面的例子中,搜索詞 MySQL 卻沒有得到任何結(jié)果,因?yàn)檫@個(gè)詞在超過一半的記錄行中出現(xiàn)。同樣的,它被有效地處理為一個(gè) stopword (即,一個(gè)零語義值的詞)。這是最理想的行為 -- 一個(gè)自然語言的查詢不應(yīng)該從一個(gè) 1GB 的表中返回每個(gè)次行(second row)。

匹配表中一半記錄行的詞很少可能找到相關(guān)文檔。實(shí)際上,它可能會(huì)發(fā)現(xiàn)許多不相關(guān)的文檔。我們都知道,當(dāng)我們在互聯(lián)網(wǎng)上通過搜索引擎試圖搜索某些東西時(shí),這會(huì)經(jīng)常發(fā)生。因?yàn)檫@個(gè)原因,在這個(gè)特殊的數(shù)據(jù)集中,這樣的行被設(shè)置一個(gè)低的語義值。

到 4.0.1 時(shí),MySQL 也可以使用 IN BOOLEAN MODE 修飾語來執(zhí)行一個(gè)邏輯全文搜索。

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 ... | +----+------------------------------+-------------------------------------+


這個(gè)查詢返回所有包含詞 MySQL 的記錄行(注意: 50% 的閾值沒有使用),但是它沒有包含詞 YourSQL。注意,一個(gè)邏輯模式的搜索不會(huì)自動(dòng)地以相似值的降序排序記錄行。你可以從上面的結(jié)果出看得出來,最高的相似值(包含 MySQL 兩次的那個(gè)) 最列在最后,而不是第一位。一個(gè)邏輯全文搜索即使在沒有一個(gè) FULLTEXT 索引的情況下也可以工作,然而它 些。

邏輯全文搜索支持下面的操作符:

+
一個(gè)領(lǐng)頭的加號(hào)表示,該詞必須出現(xiàn)在每個(gè)返回的記錄行中。

-
一個(gè)領(lǐng)頭的減號(hào)表示,該詞必須不出現(xiàn)在每個(gè)返回的記錄行中。

缺省的 (當(dāng)既沒有加號(hào)也沒有負(fù)號(hào)被指定時(shí))詞是隨意的,但是包含它的記錄行將被排列地更高一點(diǎn)。這個(gè)模仿沒有 IN BOOLEAN MODE 修飾詞的 MATCH() ... AGAINST() 的行為。

< >
這兩個(gè)操作符用于改變一個(gè)詞的相似性值的基值。< 操作符減少基值,> 操作符則增加它。參看下面的示例。

( )
圓括號(hào)用于對子表達(dá)式中的詞分組。

~
一個(gè)領(lǐng)頭的否定號(hào)的作用象一個(gè)否定操作符,引起行相似性的詞的基值為負(fù)的。它對標(biāo)記一個(gè)噪聲詞很有用。一個(gè)包含這樣的詞的記錄將被排列得低一點(diǎn),但是不會(huì)被完全的排除,因?yàn)檫@樣可以使用 - 操作符。

*
一個(gè)星號(hào)是截?cái)嗖僮鞣?。不想其它的操作符,它?yīng)該被追加到一個(gè)詞后,不加在前面。

"
短語,被包圍在雙引號(hào)"中,只匹配包含這個(gè)短語(字面上的,就好像被鍵入的)的記錄行。

這里是一些示例:

apple banana
找至少包含上面詞中的一個(gè)的記錄行
+apple +juice
... 兩個(gè)詞均在被包含
+apple macintosh
... 包含詞 “apple”,但是如果同時(shí)包含 “macintosh”,它的排列將更高一些
+apple -macintosh
... 包含 “apple” 但不包含 “macintosh”
+apple +(>pie
... 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一點(diǎn)
apple*
... 包含 “apple”,“apples”,“applesauce” 和 “applet”
"some words"
... 可以包含 “some words of wisdom”,但不是 “some noise words”

6.8.1 全文的限制

  • MATCH() 函數(shù)的所有參數(shù)必須是從來自于同一張表的列,同時(shí)必須是同一個(gè)FULLTEXT 索引中的一部分,除非 MATCH()IN BOOLEAN MODE 的。

  • MATCH() 列列表必須確切地匹配表的某一 FULLTEXT 索引中定義的列列表,除非 MATCH()IN BOOLEAN MODE 的。

  • AGAINST() 的參數(shù)必須是一個(gè)常量字符串。

6.8.2 微調(diào) MySQL 全文搜索

不幸地,全文搜索仍然只有很少的用戶可調(diào)參數(shù),雖然增加一些在 TODO 上排列很高。如果你有一個(gè) MySQL 源碼發(fā)行(查看章節(jié) source">2.3 安裝一個(gè) MySQL 源碼發(fā)行),你可以發(fā)揮對全文搜索的更多控制。

注意,全文搜索為最佳的搜索效果,被仔細(xì)地調(diào)整了。修改默認(rèn)值的行為,在大多數(shù)情況下,只會(huì)使搜索結(jié)果更糟。不要修改 MySQL 的源代碼,除非你知道你在做什么!

  • 被索引的詞的最小長度由 MySQL 變量 ft_min_word_len 指定。查看章節(jié) 4.5.6.4 SHOW VARIABLES。將它改為你所希望的值,并重建你的 FULLTEXT 索引。 (這個(gè)變量只從 MySQL 4.0 開始被支持)

  • stopword 列表可以從 ft_stopword_file 變量指定的文件中讀取。查看章節(jié) 4.5.6.4 SHOW VARIABLES。在修改了 stopword 列表后,重建你的 FULLTEXT 索引。(這個(gè)變量只從 MySQL 4.0.10 開始被支持)

  • 50% 閾值選擇由所選擇的特殊的衡量模式確定。為了禁止它,修改 `myisam/ftdefs.h' 文件中下面的一行:

    #define GWS_IN_USE GWS_PROB

    改為: 
    

    #define GWS_IN_USE GWS_FREQ

    然后重新編譯 MySQL。在這種情況下,不需要重建索引。 注意:使用了這個(gè),將嚴(yán)重地減少 MySQL 為 MATCH() 提供足夠的相似性值的能力。如果你確實(shí)需要搜索這樣的公共詞,最好使用 IN BOOLEAN MODE 的搜索代替,它不遵守 50% 的閾值。 
    

  • 有時(shí),搜索引擎維護(hù)員希望更改使用于邏輯全文搜索的操作符。這些由變量 ft_boolean_syntax 定義。查看章節(jié) 4.5.6.4 SHOW VARIABLES。然而,這個(gè)變量是只讀的,它的值在 `myisam/ft_static.c' 中被設(shè)置。

對于這些更改,要求你重建你的 FULLTEXT 索引,對于一個(gè) MyISAM 表,最容易的重建索引文件的方式如下面的語句:

mysql> REPAIR TABLE tbl_name QUICK;


6.8.3 全文搜索 TODO

  • 使所有對 FULLTEXT 索引的操作更快
  • 鄰近(Proximity)操作符
  • 對 "always-index words" 的支持。他們可以是用戶希望視為一個(gè)詞處理的任意字符串,例如 "C++"、"AS/400"、"TCP/IP",等等
  • 支持在 MERGE 表中的全文搜索
  • 對多字節(jié)字符的支持
  • 依照數(shù)據(jù)的語言建立 stopword 列表
  • Stemming (當(dāng)然,依賴于數(shù)據(jù)的語言)
  • Generic user-suppliable UDF preparser.
  • 使模式更加靈活 (通過為 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可調(diào)整參數(shù))

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI