mysql全文檢索原理與例項分析

2021-08-25 04:57:09 字數 3457 閱讀 5038

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

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

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

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

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、

select * from `category` where match(catname) against('phpjs')
返回結果:

id  fid  catname                                addtime  

2   0    hello phpjs,you are welcome 1263363416

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

2、

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』就可以返回所有結果了

select * from `category` where match (catname) against ('you')
返回結果還是為空,大跌眼鏡了吧,這又是為什麼呢?

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

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

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

select * from `category` where match(catname) against('you' in boolean mode)
總結:1、要注意最小字元的長度;

前面我們已經知道了mysql全文檢索的原理以及分詞技巧,同時也知道mysql全文檢索只支援英文,那麼中文該如何來檢索呢?

其基本思路是把中文轉換為英文,這裡要用到兩個表,乙個是原始內容表,乙個是原始內容轉換為英文後的表(也叫索引表),它的搜尋過程是這樣的:先對 使用者輸入的資訊進行分詞,然後把這些詞轉換為英文,這樣就可以利用mysql的全文檢索對檢索表進行匹配,得出id再從原始內容表查詢。

下面來說下兩種mysql中文檢索的方案:

分別建乙個內容表、乙個內容索引表

create table if not exists `news` (   

`id` int(8) not null auto_increment,

`content` varchar(100) default null,

primary key (`id`),

) engine=myisam default charset=utf8 ;

create table if not exists `news_index` (   

`id` int(8) not null auto_increment,

`nid` int(8) not null,

`key` text,

primary key (`id`)

) engine=myisam default charset=utf8;

1、將中文轉換為base64編碼

$data = '我要堅持學php';   

$data = base64_encode($data); //返回的結果就是編碼後的字串,這裡省略了分詞這個步驟

但是這種方式有個缺點,當使用者搜尋拼音的時候檢索不出結果;

2、將中文轉換為拼音

網上有很多將中文轉換為拼音的原始碼,看附件,之後參照上面的步驟把中文轉換為拼音就行了。

mysql全文檢索

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

mysql全文檢索

mysql到版本3.23.23時,開始支援全文檢索,通過語句select from match against 來在整個表中檢索是否有匹配的,全文索引是乙個定義為fulltext的型別索引,應用在myisam表中。值得一提的是對於乙個大的資料庫來說,把資料裝載到乙個沒有fulltext索引的表中,然...

全文檢索的原理

參考 全文檢索歸結為兩個過程 1 建立索引2 索引搜尋 先關注幾個問題 如何建立索引?索引中存放的是神馬東西?如果通過索引進行搜尋?然後關注幾個重要的概念 反向索引 倒排表 倒排索引 倒排索引檔案 停詞權重 反向索引 儲存這種對映資訊的索引稱為反向索引 solr lucene採用反向索引 就是從關鍵...