mysql 全文本检索的列_Mysql 全文本检索
mysql 全文索引
注意 并非所有的引擎都支持 全文檢索
mysql最常用的引擎 INnodb 和 myisam 后者支持全文檢索 前者不支持
創(chuàng)建表的時(shí)候指定要檢索列 CREATE TABLE TEST_FULLTEXT(note_id int not null auto_increment,note_text text null, primaty key(note_id),FULLTEXT(note_text) )engine=myisam;
fulltext 索引某個(gè)列 fulltext(note_text) ,在某note_text列上建立全文索引
插入數(shù)據(jù)
然后用 match()指定列 Against()指定詞
如 語(yǔ)句 select * from TEST_FULLTEXT where Match(note_text) Against('hello');
查找note_txt列中含有 hello詞的行 返回的結(jié)果為 兩行 note_text
'hello' was said by quester
quster say 'hello' to pp and he try again
- 注意 搜索是不區(qū)分大小的 除非使用 BINARY方式
既然這樣 為什么 不用 like語(yǔ)句呢 再來(lái)看上面例子 用like實(shí)現(xiàn)
select * from TEST_FULLTEXT where note_text like '%hello%';
返回的結(jié)果一樣為兩行
note_text
quster say 'hello' to pp and he try again
'hello' was said by quester
看采用全文搜索和like的返回結(jié)果 使用全文搜索的返回結(jié)果是已經(jīng)排好序的 而 like的返回結(jié)果則沒有
排序主要是針對(duì) hello出現(xiàn)在行的位置
全文結(jié)果中 第一個(gè)詞 和 第三個(gè)詞 like則沒有按順序排
Mysql主要根據(jù)等級(jí)來(lái)進(jìn)行排序
我們可以采用下面方式查看 表中某一列 在某一個(gè)詞的等級(jí) ,繼續(xù)用上面的例子 select note_text, Match(note_text) Aginst('hello') as rannk from TEST_FULLTEXT
輸出如下: note_text rank
fhgjkhj 0
fdsf shi jian 0
quster say 'hello' to pp and he try again 1.3454876123454
huijia quba 0
'hello' was said by quester 1.5656454547876
等級(jí)的計(jì)算 由 mysql 由根據(jù)行中詞的數(shù)目、唯一詞的數(shù)目、整個(gè)索引中詞的總數(shù)以及包含改詞行的數(shù)目計(jì)算出來(lái) 不包含詞的行的等級(jí) 為0 上面的結(jié)果中 詞在前面的等級(jí)值要高于在后面的
使用查詢擴(kuò)展
當(dāng)你想要在note_text 中查找 pp時(shí) 從上面知道 只有一行 如果用下面語(yǔ)句 select note_text from test_fulltext where match(note_text) against('pp');
返回結(jié)果是 note_text
quster say 'hello' to pp and he try again
如果采用擴(kuò)展查詢,分為以下三部
1、先根據(jù)全文檢索 查找到 所有行 如上面的返回結(jié)果 只有一行
2、mysql檢索上面1的所以行,選擇有用的詞
3、mysql再次全文檢索,這一次還需要加上2中選擇出來(lái)的有用的詞 作為against中的詞 select note_text from test_fulltext where match(note_text) against('pp' with query expansion);
返回結(jié)果 note_text
quster say 'hello' to pp and he try again
'hello' was said by quester
如pp本來(lái)有的行中含有 hello 所以hello也作為關(guān)鍵字
使用布爾查詢
即使沒有建立fulltext索引也能夠用,但是速度非常慢 沒有50%規(guī)則 (參見下 50%規(guī)則介紹)
可以用包含特定意義的操作符,如 +、-、"",作用于查詢字符串上。查詢結(jié)果不是以相關(guān)性排序的。
如語(yǔ)句 select note_text from test_fulltext where match(note_text) against('hello -pp*' IN BOOLEAN MODE );
表示匹配hello但是不包含 pp的行 結(jié)果為 note_text
'hello' was said by quester
全文檢索的一些說(shuō)明 和限制
1、只有MyISAM表支持
2、對(duì)大多數(shù)的多字節(jié)字符集適用,進(jìn)行全文索引的列必須使用相同的字符集和校驗(yàn)碼(collation)。
3、表意性語(yǔ)言,如漢語(yǔ)、日語(yǔ)沒有詞分界符(英語(yǔ)用空格隔開每個(gè)單詞),全文分析器無(wú)法確定一個(gè)詞的開始和結(jié)尾,所以MySQL中的全文檢索不支持。
4、在自然語(yǔ)言檢索中,只能檢索被全文索引的那些列,如果要對(duì)索引的多列進(jìn)行某一列的檢索,必須對(duì)這一列單獨(dú)建立全文索引。布爾檢索可以在非索引的列上進(jìn)行,但會(huì)慢一些。
5、against后的參數(shù)必須是常量字符串。
6、索引沒有記錄關(guān)鍵詞在字符串中的位置,排序算法太單一。
7、如果索引不在內(nèi)存中,檢索速度會(huì)很慢;如果是短語(yǔ)查詢,需要索引和數(shù)據(jù)都在內(nèi)存中,否則速度會(huì)很慢,所以需要更大的key buffer。索引有碎片時(shí)也會(huì)很慢,所以需要更頻繁的optimize table操作。
8、全文索引對(duì)于insert、update、delete都很慢。如更改100個(gè)詞需要進(jìn)行100次的索引操作而不是1次。
50% 規(guī)則 如果一個(gè)詞出現(xiàn)在50%以上的行中,那么mysql將他作為一個(gè)非用詞忽略 50%規(guī)則不適用于布爾查詢
如果行數(shù)小于三行 則不返回結(jié)果 參考 50%規(guī)則
總結(jié)
以上是生活随笔為你收集整理的mysql 全文本检索的列_Mysql 全文本检索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成spark_全面对比,深度解析 Ig
- 下一篇: oracle的主目录怎么删除,删除ora