| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> mysql >> 適宜做簡單搜索的MySQL數據庫全文索引
 

適宜做簡單搜索的MySQL數據庫全文索引

2008-07-10 05:54:06  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  全文索引在 MySQL 中是一個 FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之後使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創建。對于大的數據庫,將數據裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE (或 CREATE INDEX) 創建索引,這將是非常快的。將數據裝載到一個已經有 FULLTEXT 索引的表中,將是非常慢的。

  全文搜索通過 MATCH() 函數完成:

  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)

  函數 MATCH() 對照一個文本集(包含在一個 FULLTEXT 索引中的一個或多個列的列集)執行一個自然語言搜索一個字符串。搜索字符串做爲 AGAINST() 的參數被給定。搜索以忽略字母大小寫的方式執行。對于表中的每個記錄行,MATCH() 返回一個相關性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。

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

  它也可以執行一個邏輯模式的搜索。這在下面的章節中被描述。

  前面的例子是函數 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)

  下面的示例更複雜一點。查詢返回相似性並依然以相似度遞減的次序返回記錄行。爲了完成這個結果,你應該指定 MATCH() 兩次。這不會引起附加的開銷,因爲 MySQL 優化器會注意到兩次同樣的 MATCH() 調用,並只調用一次全文搜索代碼。

  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 使用一個非常簡單的剖析器來將文本分隔成詞。一個「詞」是由文字、數據、「'」 和 「_」 組成的任何字符序列。任何在 stopword 列表上出現的,或太短的(3 個字符或更少的)的 「word」 將被忽略。

  在集和查詢中的每個合適的詞根據其在集與查詢中的重要性衡量。這樣,一個出現在多個文檔中的詞將有較低的權重(可能甚至有一個零權重),因爲在這個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個較高的權重。然後,詞的權重將被結合用于計算記錄行的相似性。

  這樣一個技術工作可很好地工作與大的集(實際上,它會小心地與之諧調)。 對于非常小的表,詞分類不足以充份地反應它們的語義值,有時這個模式可能産生奇怪的結果。

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

  Empty set (0.00 sec)

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

  匹配表中一半記錄行的詞很少可能找到相關文檔。實際上,它可能會發現許多不相關的文檔。我們都知道,當我們在互聯網上通過搜索引擎試圖搜索某些東西時,這會經常發生。因爲這個原因,在這個特殊的數據集中,這樣的行被設置一個低的語義值。

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

  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。注意,一個邏輯模式的搜索不會自動地以相似值的降序排序記錄行。你可以從上面的結果出看得出來,最高的相似值(包含 MySQL 兩次的那個) 最列在最後,而不是第一位。一個邏輯全文搜索即使在沒有一個 FULLTEXT 索引的情況下也可以工作,然而它慢些。

  邏輯全文搜索支持下面的操作符:「+」 一個領頭的加號表示,該詞必須出現在每個返回的記錄行中,「-」 一個領頭的減號表示,該詞必須不出現在每個返回的記錄行中。

  缺省的 (當既沒有加號也沒有負號被指定時)詞是隨意的,但是包含它的記錄行將被排列地更高一點。這個模仿沒有 IN BOLEAN MODE 修飾詞的 MATCH() ... AGAINST() 的行爲。

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

  ( ) 圓括號用于對子表達式中的詞分組。

  ~一個領頭的否定號的作用象一個否定操作符,引起行相似性的詞的基值爲負的。它對標記一個噪聲詞很有用。一個包含這樣的詞的記錄將被排列得低一點,但是不會被完全的排除,因爲這樣可以使用 - 操作符。

  * 一個星號是截斷操作符。不想其它的操作符,它應該被追加到一個詞後,不加在前面。

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

  這裏是一些示例:

  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" ... 可以包含 「some words of wisdom」,但不是 「some noise words」

  全文的限制

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

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

  * AGAINST() 的參數必須是一個常量字符串。

  微調MySQL全文搜索

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

  注意,全文搜索爲最佳的搜索效果,被仔細地調整了。修改默認值的行爲,在大多數情況下,只會使搜索結果更糟。不要修改 MySQL 的源代碼,除非你知道你在做什麽!

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

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

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

  #define GWS_IN_USE GWS_PROB

  改爲:

  #define GWS_IN_USE GWS_FREQ

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

  * 有時,搜索引擎維護員希望更改使用于邏輯全文搜索的操作符。這些由變量 ft_boolean_syntax 定義。然而,這個變量是只讀的,它的值在 `myisam/ft_static.c' 中被設置。

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

  mysql> REPAIR TABLE tbl_name QUICK;

  全文搜索 TODO * 使所有對 FULLTEXT 索引的操作更快

  * 鄰近(Proximity)操作符

  * 對 "always-index words" 的支持。他們可以是用戶希望視爲一個詞處理的任意字符串,例如 "C++"、"AS/400"、"TCP/IP",等等

  * 支持在 MERGE 表中的全文搜索

  * 對多字節字符的支持

  * 依照數據的語言建立 stopword 列表

  * Stemming (當然,依賴于數據的語言)

  * Generic user-suppliable UDF preparser.

  * 使模式更加靈活 (通過爲 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可調整參數)
 
 
 
上一篇《教你在MySQL 5.0以上版本中配置主從庫》
下一篇《Flash+PHP+Mysql簡單留言本制作實例教程》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
全文索引在 MySQL 中是一個 FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之後使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創建。對于大的數據庫,將數據裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE (或 CREATE INDEX) 創建索引,這將是非常快的。將數據裝載到一個已經有 FULLTEXT 索引的表中,將是非常慢的。 全文搜索通過 MATCH() 函數完成: 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) 函數 MATCH() 對照一個文本集(包含在一個 FULLTEXT 索引中的一個或多個列的列集)執行一個自然語言搜索一個字符串。搜索字符串做爲 AGAINST() 的參數被給定。搜索以忽略字母大小寫的方式執行。對于表中的每個記錄行,MATCH() 返回一個相關性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。 當 MATCH() 被使用在一個 WHERE 子句中時 (參看上面的例子),返回的記錄行被自動地以相關性從高到底的次序排序。相關性值是非負的浮點數字。零相關性意味著不相似。相關性的計算是基于:詞在記錄行中的數目、在行中唯一詞的數目、在集中詞的全部數目和包含一個特殊詞的文檔(記錄行)的數目。 它也可以執行一個邏輯模式的搜索。這在下面的章節中被描述。 前面的例子是函數 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) 下面的示例更複雜一點。查詢返回相似性並依然以相似度遞減的次序返回記錄行。爲了完成這個結果,你應該指定 MATCH() 兩次。這不會引起附加的開銷,因爲 MySQL 優化器會注意到兩次同樣的 MATCH() 調用,並只調用一次全文搜索代碼。 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 使用一個非常簡單的剖析器來將文本分隔成詞。一個「詞」是由文字、數據、「'」 和 「_」 組成的任何字符序列。任何在 stopword 列表上出現的,或太短的(3 個字符或更少的)的 「word」 將被忽略。 在集和查詢中的每個合適的詞根據其在集與查詢中的重要性衡量。這樣,一個出現在多個文檔中的詞將有較低的權重(可能甚至有一個零權重),因爲在這個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個較高的權重。然後,詞的權重將被結合用于計算記錄行的相似性。 這樣一個技術工作可很好地工作與大的集(實際上,它會小心地與之諧調)。 對于非常小的表,詞分類不足以充份地反應它們的語義值,有時這個模式可能産生奇怪的結果。 mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL'); Empty set (0.00 sec) 在上面的例子中,搜索詞 MySQL 卻沒有得到任何結果,因爲這個詞在超過一半的記錄行中出現。同樣的,它被有效地處理爲一個 stopword (即,一個零語義值的詞)。這是最理想的行爲 -- 一個自然語言的查詢不應該從一個 1GB 的表中返回每個次行(second row)。 匹配表中一半記錄行的詞很少可能找到相關文檔。實際上,它可能會發現許多不相關的文檔。我們都知道,當我們在互聯網上通過搜索引擎試圖搜索某些東西時,這會經常發生。因爲這個原因,在這個特殊的數據集中,這樣的行被設置一個低的語義值。 到 4.0.1 時,MySQL 也可以使用 IN BOOLEAN MODE 修飾語來執行一個邏輯全文搜索。 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。注意,一個邏輯模式的搜索不會自動地以相似值的降序排序記錄行。你可以從上面的結果出看得出來,最高的相似值(包含 MySQL 兩次的那個) 最列在最後,而不是第一位。一個邏輯全文搜索即使在沒有一個 FULLTEXT 索引的情況下也可以工作,然而它慢些。 邏輯全文搜索支持下面的操作符:「+」 一個領頭的加號表示,該詞必須出現在每個返回的記錄行中,「-」 一個領頭的減號表示,該詞必須不出現在每個返回的記錄行中。 缺省的 (當既沒有加號也沒有負號被指定時)詞是隨意的,但是包含它的記錄行將被排列地更高一點。這個模仿沒有 IN BOLEAN MODE 修飾詞的 MATCH() ... AGAINST() 的行爲。 < > 這兩個操作符用于改變一個詞的相似性值的基值。< 操作符減少基值,> 操作符則增加它。參看下面的示例。 ( ) 圓括號用于對子表達式中的詞分組。 ~一個領頭的否定號的作用象一個否定操作符,引起行相似性的詞的基值爲負的。它對標記一個噪聲詞很有用。一個包含這樣的詞的記錄將被排列得低一點,但是不會被完全的排除,因爲這樣可以使用 - 操作符。 * 一個星號是截斷操作符。不想其它的操作符,它應該被追加到一個詞後,不加在前面。 " 短語,被包圍在雙引號"中,只匹配包含這個短語(字面上的,就好像被鍵入的)的記錄行。 這裏是一些示例: 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" ... 可以包含 「some words of wisdom」,但不是 「some noise words」 全文的限制 * MATCH() 函數的所有參數必須是從來自于同一張表的列,同時必須是同一個FULLTEXT 索引中的一部分,除非 MATCH() 是 IN BOOLEAN MODE 的。 * MATCH() 列列表必須確切地匹配表的某一 FULLTEXT 索引中定義的列列表,除非 MATCH() 是 IN BOOLEAN MODE 的。 * AGAINST() 的參數必須是一個常量字符串。 微調MySQL全文搜索 不幸地,全文搜索仍然只有很少的用戶可調參數,雖然增加一些在 TODO 上排列很高。如果你有一個 MySQL 源碼發行(查看章節 2.3 安裝一個 MySQL 源碼發行),你可以發揮對全文搜索的更多控制。 注意,全文搜索爲最佳的搜索效果,被仔細地調整了。修改默認值的行爲,在大多數情況下,只會使搜索結果更糟。不要修改 MySQL 的源代碼,除非你知道你在做什麽! * 被索引的詞的最小長度由 MySQL 變量 ft_min_word_len 指定。查看章節 4.5.6.4 SHOW VARIABLES。將它改爲你所希望的值,並重建你的 FULLTEXT 索引。 (這個變量只從 MySQL 4.0 開始被支持) * stopword 列表可以從 ft_stopword_file 變量指定的文件中讀取。查看章節 4.5.6.4 SHOW VARIABLES。在修改了 stopword 列表後,重建你的 FULLTEXT 索引。(這個變量只從 MySQL 4.0.10 開始被支持) * 50% 阈值選擇由所選擇的特殊的衡量模式確定。爲了禁止它,修改 `myisam/ftdefs.h' 文件中下面的一行: #define GWS_IN_USE GWS_PROB 改爲: #define GWS_IN_USE GWS_FREQ 然後重新編譯 MySQL。在這種情況下,不需要重建索引。 注意:使用了這個,將嚴重地減少 MySQL 爲 MATCH() 提供足夠的相似性值的能力。如果你確實需要搜索這樣的公共詞,最好使用 IN BOOLEAN MODE 的搜索代替,它不遵守 50% 的阈值。 * 有時,搜索引擎維護員希望更改使用于邏輯全文搜索的操作符。這些由變量 ft_boolean_syntax 定義。然而,這個變量是只讀的,它的值在 `myisam/ft_static.c' 中被設置。 對于這些更改,要求你重建你的 FULLTEXT 索引,對于一個 MyISAM 表,最容易的重建索引文件的方式如下面的語句: mysql> REPAIR TABLE tbl_name QUICK; 全文搜索 TODO * 使所有對 FULLTEXT 索引的操作更快 * 鄰近(Proximity)操作符 * 對 "always-index words" 的支持。他們可以是用戶希望視爲一個詞處理的任意字符串,例如 "C++"、"AS/400"、"TCP/IP",等等 * 支持在 MERGE 表中的全文搜索 * 對多字節字符的支持 * 依照數據的語言建立 stopword 列表 * Stemming (當然,依賴于數據的語言) * Generic user-suppliable UDF preparser. * 使模式更加靈活 (通過爲 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可調整參數)
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
完美絕倫_秀色可餐
無懈可擊的優美線條
純美秀氣_楚楚動人
纖發盡顯_玲珑女生
痞子的甘南日記
疑是銀河落九天
雪域壩上四——純美色
冬日戀歌——西城楊柳弄輕柔
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有