當前位置:成語大全網 - 英語詞典 - 如何編寫MySQL全文索引插件

如何編寫MySQL全文索引插件

1.簡介全文索引插件用於擴展MYISAM的全文檢索功能。通過全文檢索,我們可以對文檔、圖片或視頻等豐富的數據類型進行分段。

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的縮寫)

字符*

對應於“”的雙引號運算符