mysql 全文索引
注意 並非所有的引擎都支援 全文檢索
mysql最常用的引擎 innodb 和 myisam 後者支援全文檢索 前者不支援
建立表的時候指定要檢索列
create table test_fulltext(note_id int not null auto_increment,note_text text null,
primaty key(note_id),fulltext(note_text)
)engine=myisam;
fulltext 索引某個列 fulltext(note_text) ,在某note_text列上建立全文索引
插入資料
然後用 match()指定列 against()指定詞
如 語句
select *
from test_fulltext
where match(note_text) against(『hello『);
查詢note_txt列中含有 hello詞的行 返回的結果為 兩行
note_text
『hello『 was said by quester
quster say 『hello『 to pp and he try again
- 注意 搜尋是不區分大小的 除非使用 binary方式
既然這樣 為什麼 不用 like語句呢 再來看上面例子 用like實現
select *
from test_fulltext
where note_text like 『%hello%『;
返回的結果一樣為兩行
note_text
quster say 『hello『 to pp and he try again
『hello『 was said by quester
看採用全文搜尋和like的返回結果 使用全文搜尋的返回結果是已經排好序的 而 like的返回結果則沒有
排序主要是針對 hello出現在行的位置
全文結果中 第乙個詞 和 第三個詞 like則沒有按順序排
mysql主要根據等級來進行排序
我們可以採用下面方式檢視 表中某一列 在某乙個詞的等級 ,繼續用上面的例子
select note_text, match(note_text) aginst(『hello『) as rannk
from test_fulltext
輸出如下:
note_text rank
fhgjkhj 0
fdsf shi jian 0
quster say 『hello『 to pp and he try again 1.3454876123454
huijia quba 0
『hello『 was said by quester 1.5656454547876
等級的計算 由 mysql 由根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含改詞行的數目計算出來 不包含詞的行的等級 為0 上面的結果中 詞在前面的等級值要高於在後面的
使用查詢擴充套件
當你想要在note_text 中查詢 pp時 從上面知道 只有一行 如果用下面語句
select note_text
from test_fulltext
where match(note_text) against(『pp『);
返回結果是
note_text
quster say 『hello『 to pp and he try again
如果採用擴充套件查詢,分為以下三部
1、先根據全文檢索 查詢到 所有行 如上面的返回結果 只有一行
2、mysql檢索上面1的所以行,選擇有用的詞
3、mysql再次全文檢索,這一次還需要加上2中選擇出來的有用的詞 作為against中的詞
select note_text
from test_fulltext
where match(note_text) against(『pp『 with query expansion);
返回結果
note_text
quster say 『hello『 to pp and he try again
『hello『 was said by quester
如pp本來有的行中含有 hello 所以hello也作為關鍵字
使用布林查詢
即使沒有建立fulltext索引也能夠用,但是速度非常慢 沒有50%規則 (參見下 50%規則介紹)
可以用包含特定意義的操作符,如 +、-、"",作用於查詢字串上。查詢結果不是以相關性排序的。
如語句select note_text
from test_fulltext
where match(note_text) against(『hello -pp*『 in boolean mode );
表示匹配hello但是不包含 pp的行 結果為
note_text
『hello『 was said by quester
全文檢索的一些說明 和限制
1、只有myisam表支援
2、對大多數的多位元組字符集適用,進行全文索引的列必須使用相同的字符集和校驗碼(collation)。
3、表意性語言,如漢語、日語沒有詞分界符(英語用空格隔開每個單詞),全文分析器無法確定乙個詞的開始和結尾,所以mysql中的全文檢索不支援。
4、在自然語言檢索中,只能檢索被全文索引的那些列,如果要對索引的多列進行某一列的檢索,必須對這一列單獨建立全文索引。布林檢索可以在非索引的列上進行,但會慢一些。
5、against後的引數必須是常量字串。
7、如果索引不在記憶體中,檢索速度會很慢;如果是短語查詢,需要索引和資料都在記憶體中,否則速度會很慢,所以需要更大的key buffer。索引有碎片時也會很慢,所以需要更頻繁的optimize table操作。
8、全文索引對於insert、update、delete都很慢。如更改100個詞需要進行100次的索引操作而不是1次。
50% 規則
如果乙個詞出現在50%以上的行中,那麼mysql將他作為乙個非用詞忽略 50%規則不適用於布林查詢
如果行數小於三行 則不返回結果 參考 50%規則
原文:
Mysql 全文字檢索
注意 並非所有的引擎都支援 全文檢索 mysql最常用的引擎 innodb 和 myisam 後者支援全文檢索 前者不支援 建立表的時候指定要檢索列 create table test fulltext note id int notnull auto increment,note text tex...
mysql的全文檢索
mysql的全文檢索 mysql的全文檢索 mysql create table articles id int unsigned auto increment not null primary key,title varchar 200 body text,fulltext title,body ...
mysql的全文檢索
1.使用mysql全文檢索fulltext的先決條件 表的型別必須是myisam 建立全文檢索的字段型別必須是char,varchar,text 2.建立全文檢索先期配置 由於mysql的預設配置是索引的詞的長度是4,所以要支援中文單字的話,首先更改這個.unix使用者要修改my.cnf,一般此檔案...