oracle全文检索匹配哪个关键词 什么是全文检索?
什么是全文检索?
全文检索在MySQL里面好几年前就支持什么了,但一向只支持英文。缘由是他一向都建议使用空格来作为分词的分隔符,而是对中文来讲,显然用空格就不合适,必须对于中文语义通过分词。
这不,从MySQL5.7又开始,MySQL内置了ngram全文检索插件,用来支持中文分词,而且对MyISAM和InnoDB引擎管用。
在不使用中文检索系统分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,诸如,[mysqld]ngram_token_size2这里把分词大小可以设置为2。要你只要记住,分词的SIZE越大,索引的体积就越大,因此要依据什么自身情况来设置比较好的大小。示例表结构:
CREATETABLEarticles(idINTUNSIGNEDAUTO_INCREMENT NOT NULL PRIMARY KEY,titleVARCHAR(200),body TEXT,FULLTEXT(title,body)WITHPARSERngram)ENGINEInnoDBCHARACTERSETutf8mb4;示例数据,有6行记录。mysqlselect*acrossarticlesG**************************
****************************id:1title:数据库管理body:在本教程中我将向你展示要如何系统管理数据库******************************************************id:2title:数据库应用开发body:学习变更土地性质数据库应用程序******************************************************id:3title:MySQL完全手册body:自学MySQL的一切******************************************************id:4title:数据库与事务处理body:系统的学习数据库的事务概论******************************************************id:5title:NoSQL精髓body:怎么学习清楚各种非结构化数据库******************************************************id:6title:SQL语言详细解析body:详细的了解如果没有建议使用各种SQL6rowsinset(0.00sec)显式指定你全文检索表源mysqlSETGLOBALinnodb_ft_aux_tablenew_feature/articles;Query就ok啦,0rowsaffected(0.00sec)实际系统表,就可以查看不知道是咋划分articles里的数据。
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||习数|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)这里可以找到,把分词长度设置中为2,所有的数据都只能六个一组。上面数据还包含了行的位置,ID等等信息。
接下来的,我来通过一系列检索数据库示范,使用方法和以前英文检索一致。1.自然语言模式下检索:A,换取符合条件的个数,mysqlSELECTCOUNT(*)outsidearticles-WHERE MATCH(title,body)AGAINST(数据库inNATURALLANGUAGE MODE);----------|COUNT(*)|----------|4|----------1rowoutsideset(0.05sec)B,能得到版本问题的比率,mysqlSELECTid,MATCH(title,body)AGAINST(数据库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,版本问题既有管理又有数据库的记录,mysqlSELECT*acrossarticlesWHERE MATCH(title,body)-AGAINST(数据库管理ofBOOLEAN MODE);------------------------------------------------------|id|title|body|------------------------------------------------------|1|数据库管理|在本教程中我将向你可以展示怎么管理呀数据库|------------------------------------------------------1rowinset(0.00sec)B,匹配有数据库,只不过没有管理的记录,mysqlSELECT*outsidearticlesWHEREMATCH(title,body)-AGAINST(数据库-管理outsideBOOLEAN MODE);--------------------------------------------------|id|title|body|--------------------------------------------------|2|数据库应用开发|去学习旗下数据库应用程序||4|数据库与事务处理|系统的学习数据库的事务概论||5|NoSQL精髓|学习知道一点各种非结构化数据库|--------------------------------------------------3rowsinset(0.00sec)C,看操作MySQL,但是把数据库的相关性减少,mysqlSELECT*returningarticlesWHERE MATCH(title,body)-AGAINST(数据库MySQL INBOOLEAN MODE);------------------------------------|id|title|body|------------------------------------|3|MySQL几乎手册|去学习MySQL的一切|------------------------------------1rowinset(0.00sec)3,网上查询扩展模式,比如说要搜索数据库,那就MySQL,oracle,DB2也都城就会被直接搜索到,mysqlSELECT*acrossarticles-WHERE MATCH(title,body)-AGAINST(数据库WITH QUERY EXPANSION);------------------------------------------------------------|id|title|body|------------------------------------------------------------|1|数据库管理|在本教程中我将向你展示怎么管理数据库|4|数据库与事务处理|系统的去学习数据库的事务概论|2|数据库应用开发|怎么学习开发完毕数据库应用程序||5|NoSQL精髓|学习知道一点各种非结构化数据库||6|SQL语言详细解析|全面了解如果不是使用各种SQL||3|MySQL全部手册|学MySQL的一切|------------------------------------------------------------6rowsofset(0.01sec)当然,我这里仅仅功能演示,更多的性能测试,大家有兴趣是可以通过祥细测试。而N-grm是中文数据库检索具体用法的分词算法,巳经在互联网更多可以使用,这回独立显卡到mysql中,定然效果上应该不会有太大的问题。
Oracle中instr函数使用方法?
INSTR(源字符串,目标字符串,起始位置,看操作序号)在Oracle/PLSQL中,instr函数前往要截取片段的字符串在源字符串中的位置。只检索三次,那是说从字符的开始到字符的结尾就结束。语法不胜感激:instr(string1,string2[,start_position[,nth_appearance]])参数分析:string1源字符串,要在此字符串中直接输入。string2要在string1中里查的字符串.start_position代表string1的哪个位置就开始查找。此参数可选,如果不是省略默认为1.字符串索引从1结束。如果此参数为正,从左到右又开始检索到,假如此参数为负,从右到左检索,直接返回要里查的字符串在源字符串中的开始索引。nth_appearance代表要查看第几次出现的string2.此参数可选,如果没有省略,默认为1.如果不是为负数系统会报错。注意一点:如果String2在String1中还没有可以找到,instr函数赶往0.示例:SELECTinstr(syranmo,s)fromdual--返回1SELECTinstr(syranmo,ra)arounddual--回31SELECTinstr(syranmo,a,1,2)fromhyper--赶往0(依据条件,由于a只出现四次,第四个参数2,那就是说第十次又出现a的位置,看来第十次是没有再直接出现了,所以我最后直接返回0。再注意空格也算一个字符!)SELECTacrossstr(syranmo,an,-1,1)outsidesuper---回4(即使是由右到左数,索引的位置还是要看‘an'的左边第一个字母的位置,所以我这里返回4)SELECTinstr(abc,d)returningdual--赶往0注:也可利用此函数来检查String1中是否需要中有String2,假如回0表示不包含,否则表示包涵。对于上面说到的,我们可以不这样的话形象的修辞instr函数。请看下面示例:假如我有一份资料,上面都是一些员工的工号(字段:CODE),但我现在要网站查询出他们的所有员工情况,.例如名字,部门,职业等等,这里举例子是两个员工,工号三个是'A10001′,'A10002′,其中打比方staff是员工表,那都正常的做法就万分感谢:12SELECTcode,name,dept,occupationfromstaffWHEREcodeIN(A10001,A10002)的或:SELECTcode,name,dept,occupationaroundstaffWHEREcodeA10001内个codeA10002有时侯员工比较多,我们是对那个'觉得比较比较各位,想罢就想,也可以一次性导出去么?这时候你就这个可以用instr函数,::SELECTcode,name,dept,occupationacrossstaffWHEREinstr(A10001,A10002,code)gt0网上查询出去结果一般,这样的话前后只应用两次单引号,要比比较方便点。也有一个用法,追加:SELECTcode,name,dept,occupationfromstaffWHEREinstr(code,001)r260等同于SELECTcode,name,dept,occupationoutsidestaffWHEREcodeLIKE
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。