MySQL全文檢索中Like索引的實現

2021-06-06 12:59:33 字數 1736 閱讀 7096

**

在實際業務中,很難避免mysql全文檢索並like索引的這種需求。比如模糊搜尋使用者帳號,暱稱之類。本文向您介紹如何在mysql全文檢索中實現like索引。

ad:

在資料庫使用中,dba都會告訴大家sql的like條件為%***%號時,由於不能使用索引,當資料量變大時(比如超過百萬條),全表掃瞄會導致效能很差。

但是在實際業務中,很難避免mysql全文檢索並like索引的這種需求。比如模糊搜尋使用者帳號,暱稱之類。既然這個需求必須做,但又不可以直接用like。這裡我和大家分享一下我們關於這種需求的一種解決方案。當然別人也可能採用過類似的辦法,我不是很清楚。所以也用一下「原創」吧。

mysql資料庫很早就支援全文索引,但是全文索引和like語句是不同的。具體點說,全文索引的單位是詞,耳like匹配的是字元。當然實際的區別更大,比如「老鼠愛大公尺」這段文字用全文搜尋的話,條件「老鼠愛大公尺」,「老鼠和大公尺」,「大公尺老鼠」,「大公尺與老鼠」會搜尋到內容,但是「愛」,「鼠愛」,「愛大」不會搜尋到內容。反之,使用like搜尋時,「老鼠和大公尺」,「大公尺老鼠」,「大公尺與老鼠」不會找到內容,而「愛」,「鼠愛」,「愛大」會找到內容。我們這裡不討論兩種方式的優劣,根據實際情況每種功能都會有各自的實際需求。比如對於大段文字,全文檢索是最好的方法,但是對於姓名,帳號,暱稱等很短的通常無意義文字,like會更合適一些。

雖然全文檢索和like搜尋不同,但是在特殊情況下,可以用全文搜尋功能來實現like搜尋。具體就是每個字元作為乙個詞,而且使用雙引號來限制詞精確匹配(簡單點說就是老鼠大公尺和大公尺老鼠不同),這樣可以實現like搜尋的功能。

下面還是說一下具體的做法吧。

首先,資料庫指定 --ft_min_word_len=2 --ft_stopword_file=""。第乙個引數是告訴資料庫,小於2個字元的詞忽略。第二個是告訴資料庫不忽略任何特殊詞。這些設定是給實現功能創造條件。

然後建搜尋表

create table  tbl_search (

id int(10) unsigned not null auto_increment,

name varchar(500),

primary key  (id),

fulltext key idx_name (name)

) engine=innodb auto_increment=1;

static string encode(string input)

else if (ch >= 'a' && ch <= 'z' || ch >= 'a' && ch <= 'z')

else

else

}} // trim blank

int last = output.length() - 1;

if (last > 0 && output.charat(last) == ' ')

return output.tostring();

}

使用上面的**對要搜尋的內容編碼,比如內容是「藍皮鼠2008」,編碼後的結果是「84dd 76ae 9f20 32 30 30 38」。將編碼後的內容存入name欄位。

使用如下sql語句進行搜尋

select * from tbl_search where match(name) against('"76ae 9f20 32"' in boolean mode)

這樣就基本實現了mysql全文檢索中的like索引。

使用MySQL的全文檢索實現Like索引

在資料庫使用中,dba都會告訴大家sql的like條件為 號時,由於不能使用索引,當資料量變大時 比如超過百萬條 全表掃瞄會導致效能很差。但是在實際業務中,很難避免這種需求。比如模糊搜尋使用者帳號,暱稱之類。既然這個需求必須做,但又不可以直接用like。這裡我和大家分享一下我們關於這種需求的一種解決...

MySQL中的全文檢索

說起資料庫,mysql最適合用於小型運用的開發。最近想弄乙個簡單的 玩一下,資料庫是以前在網上爬去的。資料不是特別多,但是也不少,查了一下一共有六十多萬條歌曲的記錄。既然是做 的話,首先要有乙個搜尋的功能,至少要能夠搜尋你有的歌曲吧。由於以前沒有怎麼認真弄過sql查詢的問題,所以還是用最簡單的方法去...

mysql全文檢索

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