一、什么是停止詞?
不能用于搜索的詞,如敏感詞匯:法輪功、李宏志、器官移植等;非常常見(jiàn)的無(wú)任何具體含議的詞匯: and、or、what 、好的、我們、你們、這樣 等等。
二、停止詞相關(guān)參數(shù)
MySQL> show variables like '%innodb%stop%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| innodb_ft_enable_stopword | ON |
| innodb_ft_server_stopword_table | |
| innodb_ft_user_stopword_table | |
+---------------------------------+-------+
innodb_ft_server_stopword_table 和 innodb_ft_user_stopword_table:指定停止詞的 innodb 表,這兩個(gè)參唯一的區(qū)別就是 innodb_ft_user_stopword_table 的優(yōu)先級(jí)更高。如果沒(méi)有設(shè)置這2 個(gè)參數(shù)中的任何一個(gè),則使用默認(rèn)停止詞表 information_schema.INNODB_FT_DEFAULT_STOPWORD
三、創(chuàng)建停止詞
1、創(chuàng)建保存停止詞的表
create table stopword(value varchar(18));
注:字符串長(zhǎng)度設(shè)置不能少于 ngram_token_size * 字符長(zhǎng)度,字符長(zhǎng)度根字符集有關(guān),如:utf8 是一個(gè)中文字符占 3 個(gè)字節(jié),如果 ngram_token_size 的值是 2 ,則 2 * 3 = 6,最少不能少于6個(gè)字節(jié)(個(gè)人理解)
2、插入停止詞
insert into stopword values('法輪功')('李宏志')('我們的')('你們的');
四、innodb 全文索引的停止詞如何設(shè)置?
set global innodb_ft_user_stopword_table='test/stopword';
注:
停止詞更新后,需要重建全文索引才能生效,重建索引時(shí),stopword 表中的停止詞不再創(chuàng)建索引
注意格式:test 是 schema, stopword 是保證停止詞的表,中間用 "/" 連接
innodb 的中文全分詞使用的是 ngram 支持,其算法是二元分詞法,可以通過(guò) ngram_token_size 參數(shù)設(shè)置分詞的長(zhǎng)度,默認(rèn)是 2 ,該值越大,索引越大。
mysql> show variables like '%ngram%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| ngram_token_size | 2 |
+------------------+-------+
注:ngram_token_size的值為2 說(shuō)明以2個(gè)字符為一個(gè)詞,可以設(shè)置 innodb_ft_aux_table 參數(shù)查看分詞結(jié)果
一、查看分詞結(jié)果
1、設(shè)置參數(shù) innodb_ft_aux_table
set global innodb_ft_aux_table='test/test6';
注:test為 schema 名, test6 為具有全文索引的表名
2、查看分詞結(jié)果
--原數(shù)據(jù)
mysql> select * from test6 where id >= 7;
+----+-----------------------------+
| id | name |
+----+-----------------------------+
| 7 | 器官健康很重要 |
| 8 | 要做就做大買(mǎi)賣(mài) |
| 9 | 官買(mǎi)官賣(mài)是不靠普的 |
+----+-----------------------------+
--分詞后的數(shù)據(jù)(全文索引)
mysql> select * from information_schema.innodb_ft_index_cache;
+--------+--------------+-------------+-----------+--------+----------+
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+--------+--------------+-------------+-----------+--------+----------+
| 買(mǎi)賣(mài) | 11 | 11 | 1 | 11 | 15 |
| 做大 | 11 | 11 | 1 | 11 | 9 |
| 做就 | 11 | 11 | 1 | 11 | 3 |
| 健康 | 10 | 10 | 1 | 10 | 6 |
| 器官 | 10 | 10 | 1 | 10 | 0 |
| 大買(mǎi) | 11 | 11 | 1 | 11 | 12 |
| 官健 | 10 | 10 | 1 | 10 | 3 |
| 就做 | 11 | 11 | 1 | 11 | 6 |
| 康很 | 10 | 10 | 1 | 10 | 9 |
| 很重 | 10 | 10 | 1 | 10 | 12 |
| 要做 | 11 | 11 | 1 | 11 | 0 |
| 重要 | 10 | 10 | 1 | 10 | 15 |
+--------+--------------+-------------+-----------+--------+----------+
innodb_ft_index_cache 和 innodb_ft_index_table 表的關(guān)系:
創(chuàng)建好全文索引后,所有的數(shù)據(jù)都保存在 innodb_ft_index_table 表中,當(dāng)有新的數(shù)據(jù) insert 后,這些新數(shù)據(jù)的全文索引保存在內(nèi)存表中,即 innodb_ft_index_cache,當(dāng)做 optimize table 操作時(shí),批量把表寫(xiě)入磁盤(pán)中,即 innodb_ft_index_table 表中。
--在建表時(shí)指定
CREATE TABLE `test6` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(90) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_name` (`name`) /*!50100
WITH PARSER `ngram`
*/
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
-- 用 alter table 創(chuàng)建全文索引
alter table test6 add fulltext key idx_name(name)
with parser ngram
注:對(duì)于中文全文索引必須指定
with parser ngram
關(guān)鍵字,否則innodb 默認(rèn)的分詞算法對(duì) 中文的支持很差。
一、自然語(yǔ)言模式
-- 原數(shù)據(jù)
mysql> select * from test6 ;
+----+------------------------------------------+
| id | name |
+----+------------------------------------------+
| 1 | 工地城工 有城 |
| 2 | adfadsfadsfadsf |
| 3 | 產(chǎn)戟 要棵地地要要地大葉黃楊 |
| 4 | 宸ュ伐鍦板湴鏈夋湁鐨勭殑 |
| 5 | 人人地工地 |
| 6 | 霜國(guó)工直有直功發(fā)順豐 |
| 7 | 器官健康很重要 |
| 8 | 要做就做大買(mǎi)賣(mài) |
| 9 | 官買(mǎi)官賣(mài)是不靠普的 |
+----+------------------------------------------+
-- 使用全文索引檢查
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài)');
+----+-----------------------+
| id | name |
+----+-----------------------+
| 8 | 要做就做大買(mǎi)賣(mài) |
+----+-----------------------+
mysql> explain select * from test6 where match(name) against('買(mǎi)賣(mài)' in NATURAL LANGUAGE MODE);
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
| 1 | SIMPLE | test6 | NULL | fulltext | idx_name | idx_name | 0 | const | 1 | 100.00 | Using where;
Ft_hints
: sorted |
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
注:innodb 全文索引默認(rèn)就是使用 自然語(yǔ)言模式,所以可不用加
in NATURAL LANGUAGE MODE
二、布爾模式
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài)'
in boolean mode
);
+----+-----------------------+
| id | name |
+----+-----------------------+
| 8 | 要做就做大買(mǎi)賣(mài) |
| 10 | 做買(mǎi)賣(mài)了 |
+----+-----------------------+
如果不想要包含了 “要做”的行,則可以:
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài) -要做' in boolean mode);
+----+--------------+
| id | name |
+----+--------------+
| 10 | 做買(mǎi)賣(mài)了 |
+----+--------------+
注:只有在布爾模式下才可用以上操作符。
布爾模式下支持以下操作符:
“+”表示必須包含
“-”表示必須排除
“>”表示出現(xiàn)該單詞時(shí)增加相關(guān)性
“<”表示出現(xiàn)該單詞時(shí)降低相關(guān)性
“*”表示通配符
“~”允許出現(xiàn)該單詞,但是出現(xiàn)時(shí)相關(guān)性為負(fù)
“""”表示短語(yǔ)
no operation表示find word是可選的,如果出現(xiàn),相關(guān)性會(huì)更高
可以通過(guò)以下命令查看 布爾模式支持的操作符:
mysql> show variables like '%ft_boolean_syntax%';
+-------------------+----------------+
| Variable_name | Value |
+-------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
+-------------------+----------------+
一、DML操作對(duì)全文索引的影響
1、插入操作
插入操作較為簡(jiǎn)單,當(dāng)往表中插入記錄時(shí),提交事務(wù)時(shí)會(huì)對(duì)全文索引上的列進(jìn)行分詞存儲(chǔ)到FTS Index Cache(INNODB_FT_INDEX_CACHE),最后在批量更新到Auxiliary Table(INNODB_FT_INDEX_TABLE)中
2、刪除操作
當(dāng)提交刪除數(shù)據(jù)的事務(wù)以后,不會(huì)刪除Auxiliary Table中的數(shù)據(jù),而只會(huì)刪除FTS Index Cache中的數(shù)據(jù)。對(duì)于Auxiliary Table中被刪除的記錄,InnoDB存儲(chǔ)引擎會(huì)記錄其FTS Document Id,并將其保存在DELETED Auxiliary Table中。可以通過(guò)OPTIMIZE TABLE手動(dòng)刪除索引中的記錄。
3、更新操作
4、查找操作
分為兩步。第一步:根據(jù)檢索詞搜集符合條件的FTS_DOC_ID,在搜集滿足條件的FTS_DOC_ID首先讀取delete表中記錄的FTS_DOC_ID,這些FTS_DOC_ID隨后被用做過(guò)濾
第二步:根據(jù)FTS_DOC_ID找到對(duì)應(yīng)的記錄,找到的記錄是根據(jù)相關(guān)性大小降序返回的
二、innodb 全文索引相關(guān)表:
mysql> select table_schema, table_name from information_schema.tables where table_name like 'innodb_ft%';
+--------------------+----------------------------+
| table_schema | table_name |
+--------------------+----------------------------+
| information_schema | INNODB_FT_CONFIG |
| information_schema | INNODB_FT_BEING_DELETED |
| information_schema | INNODB_FT_DELETED |
| information_schema | INNODB_FT_DEFAULT_STOPWORD |
| information_schema | INNODB_FT_INDEX_TABLE |
| information_schema | INNODB_FT_INDEX_CACHE |
+--------------------+----------------------------+
INNODB_FT_DELETED
:保存的是innodb 表中刪除的全文索引的doc_id,避免DML操作時(shí)重組全文索引。當(dāng) OPTIMIZE TABLE 操作時(shí)才更新重組全文索引。
所以要時(shí)常的對(duì)具有全文索引的表進(jìn)行 OPTIMIZE TABLE 操作
,要不然INNODB_FT_DELETED會(huì)很大,導(dǎo)至性能問(wèn)題
INNODB_FT_BEING_DELETED
:只有在作 OPTIMIZE TABLE 操作時(shí)才使用,這是一個(gè)中間表,使用的時(shí)間很短。
INNODB_FT_INDEX_CACHE
:當(dāng)新插入數(shù)據(jù)時(shí),保存新的全文索引,避免 insert 操作導(dǎo)致索引重組,當(dāng)遇到 OPTIMIZE TABLE、關(guān)閉服務(wù)、超過(guò) innodb_ft_cache_size或 innodb_ft_total_cache_size 的限制時(shí)才合并到主索引表中(INNODB_FT_INDEX_TABLE)。
INNODB_FT_CONFIG
:innodb 全文索上的刷新、停止詞等信息。
注:要想正常使用INNODB_FT_DELETED、INNODB_FT_INDEX_CACHE等表,必需設(shè)置參數(shù) innodb_ft_aux_table,否則看不到任何信息,該參數(shù)應(yīng)該是用于調(diào)試使用
創(chuàng)建全文索引時(shí),可以設(shè)置并行度,通過(guò)參數(shù) innodb_ft_sort_pll_degree 控制。
三、innodb 全文索引相關(guān)參數(shù):
innodb_ft_aux_table:
設(shè)置調(diào)式表
ngram_token_size
:分詞長(zhǎng)度
innodb_ft_server_stopword_table / innodb_ft_user_stopword_table
:設(shè)置停止詞表,innodb_ft_user_stopword_table這個(gè)表的優(yōu)先級(jí)更高。
innodb_ft_min_token_size / innodb_ft_max_token_size
:如果使用 ngram 全文索引中日韓語(yǔ)言插件,這 2 個(gè)參數(shù)不再有用。
innodb_ft_sort_pll_degree
:創(chuàng)建全文索引時(shí)的并行度。
innodb_ft_cache_size / innodb_ft_total_cache_size
:前一個(gè)是定議每個(gè)表的全文索引內(nèi)存大小,后一個(gè)設(shè)置所有表的全文索引內(nèi)存大小,如果全文索引大小超過(guò) innodb_ft_total_cache_size 的設(shè)置,則強(qiáng)制同步(我想是fulltext index 的cache 大小與全文索引大小強(qiáng)制保持一致,意味著有內(nèi)存中不能全部加載全文索引)被取消。
innodb_optimize_fulltext_only
:optimize table 操作時(shí),只優(yōu)化全文索引。set innodb_optimize_fulltext_only = 1;

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、城區(qū)網(wǎng)站維護(hù)、網(wǎng)站推廣。
網(wǎng)站名稱:mysql全文索引
分享網(wǎng)址:http://chinadenli.net/article42/ggpchc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、品牌網(wǎng)站制作、外貿(mào)建站、搜索引擎優(yōu)化、面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)