mysql 全文字檢索的列 Mysql 全文字檢索

2021-10-19 03:13:35 字數 3149 閱讀 2820

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,一般此檔案...