oracle全文檢索匹配哪個關(guān)鍵詞 什么是全文檢索?
什么是全文檢索?全文檢索在MySQL里面好幾年前就支持什么了,但一向只支持英文。緣由是他一向都建議使用空格來作為分詞的分隔符,而是對中文來講,顯然用空格就不合適,必須對于中文語義通過分詞。這不,從My
什么是全文檢索?
全文檢索在MySQL里面好幾年前就支持什么了,但一向只支持英文。緣由是他一向都建議使用空格來作為分詞的分隔符,而是對中文來講,顯然用空格就不合適,必須對于中文語義通過分詞。
這不,從MySQL5.7又開始,MySQL內(nèi)置了ngram全文檢索插件,用來支持中文分詞,而且對MyISAM和InnoDB引擎管用。
在不使用中文檢索系統(tǒng)分詞插件ngram之前,先得在MySQL配置文件里面設(shè)置他的分詞大小,諸如,[mysqld]ngram_token_size2這里把分詞大小可以設(shè)置為2。要你只要記住,分詞的SIZE越大,索引的體積就越大,因此要依據(jù)什么自身情況來設(shè)置比較好的大小。示例表結(jié)構(gòu):
CREATETABLEarticles(idINTUNSIGNEDAUTO_INCREMENT NOT NULL PRIMARY KEY,titleVARCHAR(200),body TEXT,FULLTEXT(title,body)WITHPARSERngram)ENGINEInnoDBCHARACTERSETutf8mb4;示例數(shù)據(jù),有6行記錄。mysqlselect*acrossarticlesG**************************
****************************id:1title:數(shù)據(jù)庫管理body:在本教程中我將向你展示要如何系統(tǒng)管理數(shù)據(jù)庫******************************************************id:2title:數(shù)據(jù)庫應用開發(fā)body:學習變更土地性質(zhì)數(shù)據(jù)庫應用程序******************************************************id:3title:MySQL完全手冊body:自學MySQL的一切******************************************************id:4title:數(shù)據(jù)庫與事務處理body:系統(tǒng)的學習數(shù)據(jù)庫的事務概論******************************************************id:5title:NoSQL精髓body:怎么學習清楚各種非結(jié)構(gòu)化數(shù)據(jù)庫******************************************************id:6title:SQL語言詳細解析body:詳細的了解如果沒有建議使用各種SQL6rowsinset(0.00sec)顯式指定你全文檢索表源mysqlSETGLOBALinnodb_ft_aux_tablenew_feature/articles;Query就ok啦,0rowsaffected(0.00sec)實際系統(tǒng)表,就可以查看不知道是咋劃分articles里的數(shù)據(jù)。
mysqlSELECT*frominformation__FT_INDEX_CACHE LIMIT20,10;--------------------------------------------------------------|WORD|FIRST_DOC_ID|LAST_DOC_ID|DOC_COUNT|DOC_ID|POSITION|--------------------------------------------------------------|中我|2|2|1|2|28||習m|4|4|1|4|21||習了|6|6|1|6|16||習開|3|3|1|3|25||習數(shù)|5|5|1|5|37||知道一點|6|7|2|6|19||知道一點|6|7|2|7|23||事務|5|5|1|5|12||事務|5|5|1|5|40||何管|2|2|1|2|52|--------------------------------------------------------------10rowsintoset(0.00sec)這里可以找到,把分詞長度設(shè)置中為2,所有的數(shù)據(jù)都只能六個一組。上面數(shù)據(jù)還包含了行的位置,ID等等信息。
接下來的,我來通過一系列檢索數(shù)據(jù)庫示范,使用方法和以前英文檢索一致。1.自然語言模式下檢索:A,換取符合條件的個數(shù),mysqlSELECTCOUNT(*)outsidearticles-WHERE MATCH(title,body)AGAINST(數(shù)據(jù)庫inNATURALLANGUAGE MODE);----------|COUNT(*)|----------|4|----------1rowoutsideset(0.05sec)B,能得到版本問題的比率,mysqlSELECTid,MATCH(title,body)AGAINST(數(shù)據(jù)庫acrossNATURAL LANGUAGE MODE)suchscoreoutsidearticles;--------------------------|id|score|--------------------------|1|0.12403252720832825||2|0.12403252720832825||3|0||4|0.12403252720832825||5|0.062016263604164124||6|0|--------------------------6rowsintoset(0.00sec)2.布爾模式下直接搜索,這個就相對而言自然模式搜索來的奇怪些:A,版本問題既有管理又有數(shù)據(jù)庫的記錄,mysqlSELECT*acrossarticlesWHERE MATCH(title,body)-AGAINST(數(shù)據(jù)庫管理ofBOOLEAN MODE);------------------------------------------------------|id|title|body|------------------------------------------------------|1|數(shù)據(jù)庫管理|在本教程中我將向你可以展示怎么管理呀數(shù)據(jù)庫|------------------------------------------------------1rowinset(0.00sec)B,匹配有數(shù)據(jù)庫,只不過沒有管理的記錄,mysqlSELECT*outsidearticlesWHEREMATCH(title,body)-AGAINST(數(shù)據(jù)庫-管理outsideBOOLEAN MODE);--------------------------------------------------|id|title|body|--------------------------------------------------|2|數(shù)據(jù)庫應用開發(fā)|去學習旗下數(shù)據(jù)庫應用程序||4|數(shù)據(jù)庫與事務處理|系統(tǒng)的學習數(shù)據(jù)庫的事務概論||5|NoSQL精髓|學習知道一點各種非結(jié)構(gòu)化數(shù)據(jù)庫|--------------------------------------------------3rowsinset(0.00sec)C,看操作MySQL,但是把數(shù)據(jù)庫的相關(guān)性減少,mysqlSELECT*returningarticlesWHERE MATCH(title,body)-AGAINST(數(shù)據(jù)庫MySQL INBOOLEAN MODE);------------------------------------|id|title|body|------------------------------------|3|MySQL幾乎手冊|去學習MySQL的一切|------------------------------------1rowinset(0.00sec)3,網(wǎng)上查詢擴展模式,比如說要搜索數(shù)據(jù)庫,那就MySQL,oracle,DB2也都城就會被直接搜索到,mysqlSELECT*acrossarticles-WHERE MATCH(title,body)-AGAINST(數(shù)據(jù)庫WITH QUERY EXPANSION);------------------------------------------------------------|id|title|body|------------------------------------------------------------|1|數(shù)據(jù)庫管理|在本教程中我將向你展示怎么管理數(shù)據(jù)庫|4|數(shù)據(jù)庫與事務處理|系統(tǒng)的去學習數(shù)據(jù)庫的事務概論|2|數(shù)據(jù)庫應用開發(fā)|怎么學習開發(fā)完畢數(shù)據(jù)庫應用程序||5|NoSQL精髓|學習知道一點各種非結(jié)構(gòu)化數(shù)據(jù)庫||6|SQL語言詳細解析|全面了解如果不是使用各種SQL||3|MySQL全部手冊|學MySQL的一切|------------------------------------------------------------6rowsofset(0.01sec)當然,我這里僅僅功能演示,更多的性能測試,大家有興趣是可以通過祥細測試。而N-grm是中文數(shù)據(jù)庫檢索具體用法的分詞算法,巳經(jīng)在互聯(lián)網(wǎng)更多可以使用,這回獨立顯卡到mysql中,定然效果上應該不會有太大的問題。
Oracle中instr函數(shù)使用方法?
INSTR(源字符串,目標字符串,起始位置,看操作序號)在Oracle/PLSQL中,instr函數(shù)前往要截取片段的字符串在源字符串中的位置。只檢索三次,那是說從字符的開始到字符的結(jié)尾就結(jié)束。語法不勝感激:instr(string1,string2[,start_position[,nth_appearance]])參數(shù)分析:string1源字符串,要在此字符串中直接輸入。string2要在string1中里查的字符串.start_position代表string1的哪個位置就開始查找。此參數(shù)可選,如果不是省略默認為1.字符串索引從1結(jié)束。如果此參數(shù)為正,從左到右又開始檢索到,假如此參數(shù)為負,從右到左檢索,直接返回要里查的字符串在源字符串中的開始索引。nth_appearance代表要查看第幾次出現(xiàn)的string2.此參數(shù)可選,如果沒有省略,默認為1.如果不是為負數(shù)系統(tǒng)會報錯。注意一點:如果String2在String1中還沒有可以找到,instr函數(shù)趕往0.示例:SELECTinstr(syranmo,s)fromdual--返回1SELECTinstr(syranmo,ra)arounddual--回31SELECTinstr(syranmo,a,1,2)fromhyper--趕往0(依據(jù)條件,由于a只出現(xiàn)四次,第四個參數(shù)2,那就是說第十次又出現(xiàn)a的位置,看來第十次是沒有再直接出現(xiàn)了,所以我最后直接返回0。再注意空格也算一個字符?。㏒ELECTacrossstr(syranmo,an,-1,1)outsidesuper---回4(即使是由右到左數(shù),索引的位置還是要看‘a(chǎn)n'的左邊第一個字母的位置,所以我這里返回4)SELECTinstr(abc,d)returningdual--趕往0注:也可利用此函數(shù)來檢查String1中是否需要中有String2,假如回0表示不包含,否則表示包涵。對于上面說到的,我們可以不這樣的話形象的修辭instr函數(shù)。請看下面示例:假如我有一份資料,上面都是一些員工的工號(字段:CODE),但我現(xiàn)在要網(wǎng)站查詢出他們的所有員工情況,.例如名字,部門,職業(yè)等等,這里舉例子是兩個員工,工號三個是'A10001′,'A10002′,其中打比方staff是員工表,那都正常的做法就萬分感謝:12SELECTcode,name,dept,occupationfromstaffWHEREcodeIN(A10001,A10002)的或:SELECTcode,name,dept,occupationaroundstaffWHEREcodeA10001內(nèi)個codeA10002有時侯員工比較多,我們是對那個'覺得比較比較各位,想罷就想,也可以一次性導出去么?這時候你就這個可以用instr函數(shù),::SELECTcode,name,dept,occupationacrossstaffWHEREinstr(A10001,A10002,code)gt0網(wǎng)上查詢出去結(jié)果一般,這樣的話前后只應用兩次單引號,要比比較方便點。也有一個用法,追加:SELECTcode,name,dept,occupationfromstaffWHEREinstr(code,001)r260等同于SELECTcode,name,dept,occupationoutsidestaffWHEREcodeLIKE