站内全文检索.docx_第1页
站内全文检索.docx_第2页
站内全文检索.docx_第3页
站内全文检索.docx_第4页
站内全文检索.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

站内全文检索Like 模糊程度太低 无法匹配几个关键词不在一起的 造成全表扫描 效率低下数据库全文检索:比较快的 全文本检索规范要选作是 开启全文检索字段 会对搜索字段进行一定的分词处理 但是只能是比较常用的分词方法 数据表字段加索引 Lucene.Net 全文检索开发包 文档性的 可以指定分词工具和词库搜数据从lucene中查找 更新数据库就要更新lucene1 只能搜索文本2 要把数据写到lucene中 然后通过lucene搜索3 lucene首先把文章进行分词 挑选出关键词进行存储和加索引 文章分词算法?搜索引擎内部保存的就是一个个的词 一元分词:英文的比较好用 。StandardAnalyzer 低二元分词:每两个字算一个词。CJKAnalyzer 高Xx cc bb l中国天气 基于词库的分词算法:基于一个词库进行分词 可以提高分词的成功率和可读性。词库里面有的则可以分出来,没有的分不出来。比如庖丁解牛,盘古分词。效率比较低。词库根据需要还需要更新。一个优秀的分词算法很重要。网上择优选择一个最好的分词算法。分词算法的演示:一元分词: 3.0.3 自身测试是一元分词 Pangu分词不支持 3.0.3 L 版本 Pangu版本 2.3.0 具体解决方案在demo内 测试数据无 最多测试2千数据其他解决方案: 1 elasticsearch 2 solr EasyNet.solr 3 sphinx php常用(看样子是不太好 局限性太强了 年不更新)4 mysql全文检索方案 可以配合3使用二: mysql使用方法 三:mysql全文检索方法分词算法介绍:正向最大匹配法逆向最大匹配法最小切分双向最大匹配法综合分词特征/标志切分-断点切分现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 文本挖掘分词作用 语义识别 基于字符串机器人拟人/语法语义判断:分词系统句法系统总控部分中文分词详解:分词算法 基于理解1,词的出现频率2,文本统计/文本词库 基于统计新词识别分词难题歧义识别1 基于词典的方法(字符串匹配,机械分词方法)定义:按照一定策略将待分析的汉字串和一个“大机器词典”中的词条进行匹配,或是在词典中找到某个字符串,则匹配成功。 1.1正向最大匹配思想:MM1 从左到右取待切分的语句的m个字段作为匹配字段,m为大机器词典中最长词条个数。2 查找大机器词典并进行匹配,若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段在此匹配,重复上过程,直到切分出所有的词。 1.2 逆向最大匹配算法RMM该算法是正向最大匹配的逆向思维,匹配不成功,将匹配字段最前面的一个字去掉,实验表明逆向算法要优于正向算法。 1.3 双向最大匹配法(BM) 该算法是在正向最大匹配和逆向最大匹配中的结果进行比较从而决定正确的分词方法。 1.4 设立切分标志法 收集切分标志,在自动分词前处理切分标志,再用M,RMM等进行细加工。2 基于统计的分词(无字典分词) 主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。 N元文法模型(N-gram) 隐马尔科夫模型(HMM)分词工具(C#下能用的): 1:IKAnalyzer 正向迭代最细粒度切分法 2:CJKAnalyzer 正向迭代二元切分 不需要词典不根据语义 EXP:我们的祖国 - 我们|们的|的祖|祖国 检索出现找不到的情况蛮多3:pangu分词 采用地点和统计结合的分词算法。4:paoding5:LibMMseg是C为sphinx全文搜索引擎设计的中文分词软件包。6: imdict-chinese-analyzer是imdict智能词典的智能中文分词模块。基于HMM模型。是ictclas的重新实现。7:mmseg4j 利用MMSEG算法 实现的中文分词器 并实现lucene和solr。采用两种非此方法,都是基于正向最大匹配。8:结巴分词9:ICTCLAS 中科院分词工具基于算法的分词是不必要维护词库的,但是词库法则必须维护词库,短语在不断的发展。实际上现在许多著名的搜索引擎都采用了多种分词方法,并且有基于统计学的新词识别,自动维护词库等功能。检索引擎:solr或者Elasticsearch服务 spnix Coreseek MYSQL全文检索实例L+pangu分词实现的全文检索 分词可以换成CJKkAnalyzer或者IKAnalyzer 我查的资料是现在mysql的全文索引对中文还是不支持的,如果想要实现可以采用将内容转换为拼音存储,然后关键字转换为拼音检索,或者将内容进行分词,把分词后的保存一份,将检索条件分词,在分词后的内容中查找。用第三方实现:Demo:MYSQL57+EF6出现的BUG的解决方案:如果上面方法不好使:这个BUG到5.7.11依旧没修复。 Mysql建立好数据库之后,引用了 mysql.data和mysql.data.entity两个bll文件。构建Mysql的实体框架。获得model,在此过程中出现上述错误。按照上述解决方案修改。MYSQL全文检索解决方案:大数据量的全文检索一般都会用到MySQL的FULLTEXT全文索引,通过SELECT.MATCH.AGAINST语句来进行查找。迄今为止,MySQL对中文全文索引无法正确支持,MySQL是不会识别中文词语的。参照MySQL识别英文单词机制,要建立中文全文索引,暂时的解决方案只有手动将中文分词(以空格的形式将中文词语分开),来将中文转换成MySQL认识的语言。如今网上对于中文分词的解决方案有很多,有基于MySQL插件的,有谈论算法思想的。基于插件(如海量科技的MySQL-LinuxX86-Chinese+,hightman开发的mysql-ft-hightman)的方式主要通过对MySQL数据库安装一个别人提供好的插件,在建FULLTEXT索引的字段时后面加上WITHPARSER(大多都是这样)的形式。而基于算法思想的则大部分工作都要自己完成,但他们的大体思想都差不多:1.对插入的要建全文索引的中文数据进行分词;2.将原始数据和分词后的数据都存入数据库中,并以某种方式建立联系;3.在存储分词数据的字段上建立FULLTEXT索引;4.查询时以SELECT.MATCH.AGAINST的方式在分词字段上搜索,将搜到的行通过前面建立的联系找到原始数据行并返回。还可以在将分词之后的词组拿过来通过一定的编码方式 比如比如base64编码、urlencode编码等,汉字转拼音等 将转好的存到数据库内,搜索条件进行同样的处理之后和数据库中已存的进行比较。MySQL中文全文检索 一、概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。二、语法 MATCH (col1,col2,.) AGAINST (expr search_modifier) search_modifier: IN BOOLEAN MODE | WITH QUERY EXPANSION 例如:SELECT * FROM tab_name WHERE MATCH (列名1,列名2.列名n) AGAINST(词1 词2 词3 . 词m); 即:MATCH 相当于要匹配的列,而 AGAINST 就是要找的内容。 这里的table需要是MyISAM类型的表,col1、col2 必须是char、varchar或text类型,在查询之前需要在 col1 和 col2 上分别建立全文索引(FULLTEXT索引)。三、检索方式 1、自然语言检索: IN NATURAL LANGUAGE MODE 2、布尔检索: IN BOOLEAN MODE 剔除一半匹配行以上都有的词,譬如说,每个行都有this这个字的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用, 原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);但是若只有两行记录时,是啥鬼也查不出来的, 因为每个字都出现50%(或以上),要避免这种状况,请用IN BOOLEAN MODE。 IN BOOLEAN MODE的特色: 不剔除50%以上符合的row。 不自动以相关性反向排序。 可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 限制最长与最短的字符串。 套用Stopwords。 搜索语法规则: + 一定要有(不含有该关键词的数据条均被忽略)。 - 不可以有(排除指定关键词,含有该关键词的均被忽略)。 提高该条匹配数据的权重值。 banana orange) IN BOOLEAN MODE); 返回必须同时包含“apple banana”或者必须同时包含“apple orange”的记录。 若同时包含“apple banana”和“apple orange”的记录,则“apple banana”的权重高于“apple orange”的权重。 3、查询扩展检索: WITH QUERY EXPANSION四、MySQL全文检索的条件限制 1、在MySQL5.6以下,只有MyISAM表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索。 2、相应字段建立FULLTEXT索引五、与全文检索相关的系统变量:ft_min_word_len = 全文检索的最小许可字符(默认4,通过 SHOW VARIABLES LIKE ft_min_word_len 可查看), 中文通常是两个字就是一个词,所以做中文的话需要修改这个值为2最好。六、总结事项1、预设搜寻是不分大小写,若要分大小写,columne 的 character set要从utf8改成utf8_bin。 2、预设 MATCH.AGAINST 是以相关性排序,由高到低。 3、MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样。 如果只要单查title或content一个字段,那得另外再建一个 FULLTEXT(title) 或 FULLTEXT(content),也因为如此,MATCH()的字段一定不能跨table,但是另外两种搜寻方式好像可以。 4、MySQL不支持中文全文索引,原因很简单:与英文不同,中文的文字是连着一起写的,中间没有MySQL能找到分词的地方,截至目前MySQL5.6版本是如此,但是有变通的办法,就是将整句的中文分词,并按urlencode、区位码、base64、拼音等进行编码使之以“字母+数字”的方式存储于数据库中。 步骤1 配置my.ini,在my.ini末尾添加如下:# 修改全文检索的最小许可字符为2个字符或汉字ft_min_word_len = 2第三方检索解决方案原理:第三方 分词 索引结果查询客户端索引文件 单独保存的一个文件Data 今天天气今天 天气L : 今天阴天 今天 阴天重点类的说明Analyzer类:LuceneNet中分词算法的基类 任何自定义算法都需继承它FSDirectory类: 指定索引库文件存放文件位置 是Directory的子类(它有两个子类 还有一个RAMDirecory,它用来指定将索引库文件存放在内存中)IndexReader:对索引进行读取的类 静态方法bool IndexExists(Directory directory)-判断目录directory是否是一个索引目录IndexWriter:对索引进行写的类 静态方法bool IsLocked(Directory directory)-判断目录是否锁定 它在对索引目录写之前会把目录锁定,两个IndexWrite无法同时操作一个索引文件 IndexWrite在进行写操作的时候会自动加锁 Close自动解锁 Unlock手动解锁(通常用在程序异常退出 IndexWrite还没来得及close)Document类:要检索的文档 相当于一条记录 Add(Field field)向文档中添加字段Filed类:构造函数(字段名,字段值,是否存储原文,是否对该字段创建索引,存储索引词间距) 是否存储原文:Field.Store.YES 存储原值(如显示原内容必须为YES) Field.Store.NO不存储原值 Field.Store.YES压缩存储 是否创建索引:Field.Index.NOT_ANALYZED不创建索引 Field.Index.ANALYZED创建索引(利于检索)IndexSearcher:搜索类 Searcher类的子类 Search(查询条件Query,过滤条件Filter,检索见过存放容器Collector)Query类:所有查询条件父类(子类都具有Add方法) 子类PhraseQuery:多个关键词的拼接类 关键词间是且的关系 query.Add(new Term(字段名, 关键词) query.Add(new Term(字段名2, 关键词2) 类似于:where 字段名 contains 关键词 and 字段名2 contains 关键词21、创建Field创建Field最常用的构造函数(太多重载不一一叙述)如下:Field(string name, string value, Store store, Index index)参数说明: name:Field名称; value:Field值; Store:存储方式; Index:索引方式;Store枚举Store是一个枚举,在3.0.3版本只有两个取值了,表示是否将值存储到L里: Yes存储; No不存储;Index枚举Index是一个枚举,在3.0.3版本有以下取值, NO : 不索引(数据库主键) ANALYZED :索引经过分词器处理的字段值(正文,摘要,标题) NOT_ANALYZED :不使用分词器索引字段值(meta keyword) NOT_ANALYZED_NO_NORMS:不分析也不索引(姓名,日期等不需要模糊搜索的字段) ANALYZED_NO_NORMS :不使用分词器索引字段,也禁用索引调节因子以一篇文章为例,通常我们会按照标题和全文进行模糊搜索,这类需要进行模糊搜索的字段就用Field.Index.ANALYZED,通常会按照作者名称进行精确搜索,需要精确搜索的字段就用NOT_ANALYZED_NO_NORMS。而至于Store,比较小的内容可以直接存储,如作者,文档摘要等。而文章主体内容就没必要存储了。2、创建Document创建Document的方法如下:Document doc = new Document();这个方法用来创建一个不含任何Field的空Document。如果想把Field添加到Document里面,只需要使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论