1.介紹
全文索引插件用於擴展MYISAM的全文檢索功能。通過全文檢索,我們可以對文檔、圖片或視頻等豐富的數據類型進行分段,並建立索引進行快速檢索。
目前MySQL僅在MYISAM存儲引擎中支持全文檢索,但對於innodb,將在6.0以後的版本中實現。
但目前,全文索引也有以下局限性:
1.僅支持MyISAM。
2.不支持中文
3.如果單個表支持多個字符集,則全文索引的所有列必須使用完全相同的字符集和庫。
4.match()的列列表必須與本表中某些全文索引定義的列列表完全壹致,除非MATCH()處於布爾模式。
5.針對()的參數必須是常量字符串。
那麽全文插件在這其中起到了什麽作用呢?MYISAM自己的分詞程序會對列中的數據進行分詞並存儲在全文索引中,還會使用分詞來處理查詢中出現的字符串;全文插件可以完全接管這個功能。
比如我們可以通過插件實現多媒體數據的分詞檢索,用自己的算法分詞,甚至改變全文檢索的語法。
2.如何編寫全文插件
插件的編寫主要包括:init、deinit和parse程序;每次sql執行前會調用壹次Init(),執行完成後會調用deinit函數。Parse()函數在SQL執行期間執行語法分析。
1)申報插件
結構st_mysql_ftparser用於聲明壹個全文插件。
結構st_mysql_ftparser
{
intinterface _ version
int(* parse)(MYSQL _ ft parser _ PARAM * PARAM);
int(* init)(MYSQL _ ft parser _ PARAM * PARAM);
int(* deinit)(MYSQL _ ft parser _ PARAM * PARAM);
};
領域
類型
形容
接口版本
(同Internationalorganizations)國際組織
版本號
從語法上分析
int(* parse)(MYSQL _ ft parser _ PARAM * PARAM);
語法分析程序
初始化
int(* init)(MYSQL _ ft parser _ PARAM * PARAM);
初始化函數,函數指針
德尼特
int(* deinit)(MYSQL _ ft parser _ PARAM * PARAM);
清除函數,函數指針
可以看到,這三個函數共享壹個參數類型:MYSQL_FTPARSER_PARAM。這個結構是由MySQL初始化的,但是我們也可以修改它的函數指針來使用壹個用戶定義的函數。其結構如下:
領域
類型
形容
mysql_parse
int(* MySQL _ parse)(struct ST _ MySQL _ ft parser _ param *,
char *doc,int doc_len)
默認指向mysql內置的全文分詞功能。
mysql_add_word
int(* MySQL _ add _ word)(struct ST _ MySQL _ ft parser _ param *,
char *word,int word_len,
MYSQL _ FTPARSER _布爾信息*)
用於處理每個分解後的單詞;這些單詞通常被添加到樹或列表中。並在結束後插入/更新/刪除全文索引中的記錄。
ftparser_state
無效*
我們可以在這個指針中分配額外的內存,用於在不同的API接口之間傳遞。
mysql_ftparam
無效*
由MySQL內部使用,信息傳遞給mysql_parse和mysql_add_word,編寫插件時不需要修改。
銫
結構字符集_信息_st *
文件字符集
文件
字符*
例如,需要解析的文檔,我們可以填寫壹個url,然後在解析器中。我們可以讀取Url對應的文件並進行分析。
長度
(同Internationalorganizations)國際組織
文檔的長度,因為doc不壹定以\0結尾,所以我們寫插件的時候需要註意這壹點。
旗幟
(同Internationalorganizations)國際組織
目前只有壹個選項:MYSQL_FTFLAGS_NEED_COPY。這個選項用來告訴mysql_add_word它需要壹個word的副本;內置的mysql_parse()不需要指定這個標誌,因為它使用的是指向doc的指針,離開函數後也有效。
方式
枚舉enum_ftparser_mode
操作類型主要包括以下幾種:
MYSQL_FTPARSER_SIMPLE_MODE:解析器只返回需要的詞,不包括停用詞和過濾詞。
MYSQL_FTPARSER_WITH_STOPWORDS:用於布爾查詢的詞匹配,這種情況下需要考慮所有詞,包括停用詞。
MySQL _ ft parser _ full _ Boolean _ info:用於解析包含布爾運算符的布爾查詢字符串;在這種情況下,我們需要
設置MySQL _ add _ word-MySQL _ ft parser _ boolean _ info的參數。
當模式設置為MySQL _ ft parser _ full _ boolean _ info時。我們需要為函數mysql_add_word設置最後壹個參數,然後看看函數的原型:
int(* MySQL _ add _ word)(structst _ MySQL _ ft parser _ param *,
char *word,int word_len,
MYSQL _ FTPARSER _布爾型_ INFO *);
最後壹個參數結構是MYSQL_FTPARSER_BOOLEAN_INFO,結構是st_mysql_ftparser_boolean_info,如下圖:
領域
類型
形容
類型
enum enum_ft_token_type
用來標記令牌的類型,有以下幾種:
FT_TOKEN_EOF:
不需要設置
FT_TOKEN_WORD:
代表壹個普通的單詞
FT _ TOKEN _停用詞:
停用字詞,索引時將忽略這些字詞。
FT_TOKEN_LEFT_PAREN:
指示子表達式的開始。
FT_TOKEN_RIGHT_PAREN:
指示子表達式的結尾。
是否
(同Internationalorganizations)國際組織
用於支持布爾運算:
& gt0字必須匹配,對應+
權重_調整
(同Internationalorganizations)國際組織
關聯詞的重要性,
& gt0,對應於>運算符
wasign
茶
詞語的重要性:
非零表示有噪音的詞,會降低相關性,對應運算符~
trunc
茶
如果為非0,則該單詞被視為前綴,將匹配帶有該前綴的所有單詞,對應的運算符為*
上壹個
茶
忽略
引證(quotation的縮寫)
字符*
對應於“”的雙引號運算符