国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL 4.1.0 中文參考手冊 --- 6.8 MySQL 全文搜索

2024-07-24 12:55:26
字體:
來源:轉載
供稿:網友
注冊會員,創建你的web開發資料庫,mysql 4.1.0 中文參考手冊 --- 犬犬(心帆)翻譯 mysql reference manual for version 4.1.0-alpha.

6.8 mysql 全文搜索


到 3.23.23 時,mysql 開始支持全文索引和搜索。全文索引在 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: 0mysql> 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 boolean mode 修飾詞的 match() ... against() 的行為。

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

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

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

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

"短語,被包圍在雙引號"中,只匹配包含這個短語(字面上的,就好像被鍵入的)的記錄行。
這里是一些示例:
apple banana找至少包含上面詞中的一個的記錄行+apple +juice... 兩個詞均在被包含+apple macintosh... 包含詞 “apple”,但是如果同時包含 “macintosh”,它的排列將更高一些+apple -macintosh... 包含 “apple” 但不包含 “macintosh”+apple +(>pie <strudel)... 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一點apple*... 包含 “apple”,“apples”,“applesauce” 和 “applet”"some words"... 可以包含 “some words of wisdom”,但不是 “some noise words”6.8.1 全文的限制match() 函數的所有參數必須是從來自于同一張表的列,同時必須是同一個fulltext 索引中的一部分,除非 match() 是 in boolean mode 的。

match() 列列表必須確切地匹配表的某一 fulltext 索引中定義的列列表,除非 match() 是 in boolean mode 的。

against() 的參數必須是一個常量字符串。6.8.2 微調 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 定義。查看章節 4.5.6.4 show variables。然而,這個變量是只讀的,它的值在 `myisam/ft_static.c' 中被設置。
對于這些更改,要求你重建你的 fulltext 索引,對于一個 myisam 表,最容易的重建索引文件的方式如下面的語句:

mysql> repair table tbl_name quick;
6.8.3 全文搜索 todo使所有對 fulltext 索引的操作更快鄰近(proximity)操作符對 "always-index words" 的支持。他們可以是用戶希望視為一個詞處理的任意字符串,例如 "c++"、"as/400"、"tcp/ip",等等支持在 merge 表中的全文搜索對多字節字符的支持依照數據的語言建立 stopword 列表stemming (當然,依賴于數據的語言)generic user-suppliable udf preparser.使模式更加靈活 (通過為 create/alter table 中的 fulltext 增加某些可調整參數)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 体育| 子洲县| 伊宁县| 苏尼特右旗| 新田县| 长汀县| 迭部县| 垦利县| 隆林| 乌拉特中旗| 大埔区| 长垣县| 新田县| 潮州市| 桂东县| 北川| 武隆县| 华宁县| 辉县市| 娄烦县| 汝阳县| 吉木萨尔县| 六枝特区| 镇原县| 阜城县| 滨州市| 商洛市| 临颍县| 彩票| 黑龙江省| 苍山县| 芒康县| 韶关市| 望城县| 洛宁县| 和平区| 临朐县| 项城市| 常宁市| 广东省| 宁远县|