mysql全文檢索

2021-09-01 19:32:35 字數 3027 閱讀 7360

mysql到版本3.23.23時,開始支援全文檢索,通過語句select ... from ... match(...) against(...) 來在整個表中檢索是否有匹配的,全文索引是乙個定義為fulltext的型別索引,應用在myisam表中。值得一提的是對於乙個大的資料庫來說,把資料裝載到乙個沒有fulltext索引的表中,然後再新增索引,這樣速度會非常快,但是把資料裝載到乙個已經有fulltext索引的表中,這樣速度非常慢的。

首頁要先明白mysql的全文檢索原理:mysql使用的是乙個非常簡單的剖析器來將文字分隔成詞,空格、標點等,比如『welcom to you』將分隔為三個詞『welcom』、『to』、『you』,但是對中文來說,比如『人力方**正式上線』,這將無法分隔,因此目前mysql只支援英文的全文檢索。

下面我們通過例項來一步步把全文檢索的過程解釋清楚:

首頁我們建立表與初始化資料

sql**

1.create table if not exists `category` (

2. `id` int(10) not null auto_increment,

3. `fid` int(10) not null,

4. `catname` char(255) not null,

5. `addtime` char(10) not null,

6. primary key (`id`),

7. fulltext key `catname` (`catname`)

8.) engine=myisam default charset=utf8 auto_increment=5 ;

9. 10.

11.insert into `category` (`id`, `fid`, `catname`, `addtime`) values

12.(1, 0, 'welcome to you!', '1263363380'),

13.(2, 0, 'hello phpjs,you are welcome', '1263363416'),

14.(3, 0, 'this is the fan site of you', '1263363673');

15.

create table if not exists `category` (

`id` int(10) not null auto_increment,

`fid` int(10) not null,

`catname` char(255) not null,

`addtime` char(10) not null,

primary key (`id`),

fulltext key `catname` (`catname`)

) engine=myisam default charset=utf8 auto_increment=5 ;

insert into `category` (`id`, `fid`, `catname`, `addtime`) values

(1, 0, 'welcome to you!', '1263363380'),

(2, 0, 'hello phpjs,you are welcome', '1263363416'),

(3, 0, 'this is the fan site of you', '1263363673');

在具體例項之前,我們分析下msyql全文檢索的語法:函式 match() 對照乙個文字集(包含在乙個 fulltext 索引中的乙個或多個列的列集)執行乙個自然語言搜尋乙個字串。搜尋字串做為 against() 的引數被給定。搜尋以忽略字母大小寫的方式執行。說白了就是match給定匹配的列(fulltext型別索引),against給定要匹配的字串,多個用空格、標點分開,mysql會自動分隔。

1、sql**

1.select * from `category` where match(catname) against('phpjs')

返回結果:

id fid catname addtime

2 0 hello phpjs,you are welcome 1263363416

匹配出了含有phpjs關鍵字的行資料。

2、sql**

1.select * from `category` where match (catname) against ('this')

按照上面的思路,第三行資料含有this,因此應該可以匹配出第三行資料的,但事實卻奇怪得很,返回結果為空,為什麼呢?

原來是mysql指定了最小字元長度,預設是4,必須要匹配大於4的才會有返回結果,可以用show variables like 'ft_min_word_len' 來檢視指定的字元長度,也可以在mysql配置檔案my.ini 更改最小字元長度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完後重啟mysql即可。

3、這裡我們要確定把最小字元改為2了,因為3行記錄都有『you』,因此心想,匹配『you』就可以返回所有結果了

sql**

1.select * from `category` where match (catname) against ('you')

返回結果還是為空,大跌眼鏡了吧,這又是為什麼呢?

原來mysql在集和查詢中的對每個合適的詞都會先計算它們的權重,乙個出現在多個文件中的詞將有較低的權重(可能甚至有乙個零權重),因為在這個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到乙個較高的權重,mysql預設的閥值是50%,上面『you』在每個文件都出現,因此是100%,只有低於50%的才會出現在結果集中。

4、有人會想,我不去管權重大小,只要有匹配的就給我返回結果集中,那麼該如何做呢?

mysql到 4.0.1 時,可以使用 in boolean mode 修飾語來執行乙個邏輯全文搜尋

sql**

1.select * from `category` where match(catname) against('you' in boolean mode)

總結:1、要注意最小字元的長度;

ps,一些學習資料:

mysql全文檢索

全文索引在 mysql 中是乙個 fulltext 型別索引。fulltext 索引用於 myisam 表,可以在 create table 時或之後使用 alter table 或 create index 在 char varchar 或 text 列上建立。對於大的資料庫,將資料裝載到乙個沒有...

MySQL全文檢索學習!

需要在my.cnf裡面設定乙個引數 full text param init ft min word len 1 use test drop table if exists tnew create table tnew id int not null primary key content long...

mysql的全文檢索

mysql的全文檢索 mysql的全文檢索 mysql create table articles id int unsigned auto increment not null primary key,title varchar 200 body text,fulltext title,body ...