1、站内全文检索Like 模糊程度太低 无法匹配几个关键词不在一起的 造成全表扫描 效率低下数据库全文检索:比较快的 全文本检索规范要选作是 开启全文检索字段 会对搜索字段进行一定的分词处理 但是只能是比较常用的分词方法 数据表字段加索引 Lucene.Net 全文检索开发包 文档性的 可以指定分词工具和词库搜数据从 lucene 中查找 更新数据库就要更新 lucene1 只能搜索文本2 要把数据写到 lucene 中 然后通过 lucene 搜索3 lucene 首先把文章进行分词 挑选出关键词进行存储和加索引 文章分词算法?搜索引擎内部保存的就是一个个的词 一元分词:英文的比较好用 。Sta
2、ndardAnalyzer 低二元分词:每两个字算一个词。CJKAnalyzer 高Xx cc bb l中国天气 基于词库的分词算法:基于一个词库进行分词 可以提高分词的成功率和可读性。词库里面有的则可以分出来,没有的分不出来。比如庖丁解牛,盘古分词。效率比较低。词库根据需要还需要更新。一个优秀的分词算法很重要。网上择优选择一个最好的分词算法。分词算法的演示:一元分词: 3.0.3 自身测试是一元分词 Pangu 分词不支持 3.0.3 L 版本 2.9.2.2Pangu 版本 2.3.0 具体解决方案在 demo 内 测试数据无 最多测试 2 千数据其他解决方案:1 elasticsear
3、ch2 solr EasyNet.solr 3 sphinx php 常用(看样子是不太好 局限性太强了 年不更新)4 mysql 全文检索方案 可以配合 3 使用二: mysql 使用方法 三:mysql 全文检索方法分词算法介绍:现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于正向最大匹配法逆向最大匹配法最小切分双向最大匹配法综合分词特征/ 标志切分-断点切分统计的分词方法。 文本挖掘分词作用 语义识别基于字符串中文分词详解: 分词算法 基于理解基于统计新词识别分词难题歧义识别机器人拟人 /语法语义判断:分词系统句法系统总控部分1,词的出现频率2,文本统计 /
4、文本词库1 基于词典的方法(字符串匹配,机械分词方法)定义:按照一定策略将待分析的汉字串和一个“大机器词典”中的词条进行匹配,或是在词典中找到某个字符串,则匹配成功。1.1 正向最大匹配思想:MM1 从左到右取待切分的语句的 m 个字段作为匹配字段,m 为大机器词典中最长词条个数。2 查找大机器词典并进行匹配,若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段在此匹配,重复上过程,直到切分出所有的词。1.2 逆向最大匹配算法 RMM该算法是正向最大匹配的逆向思维,匹配不成功,将匹配字段最前面的一个字去掉,实验表明逆向算法
5、要优于正向算法。1.3 双向最大匹配法(BM)该算法是在正向最大匹配和逆向最大匹配中的结果进行比较从而决定正确的分词方法。1.4 设立切分标志法收集切分标志,在自动分词前处理切分标志,再用 M,RMM 等进行细加工。2 基于统计的分词(无字典分词)主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。N 元文法模型(N-gram) 隐马尔科夫模型(HMM)分词工具(C#下能用的):1: IKAnalyzer 正向迭代最细粒度切分法 2: CJKAnalyzer 正向迭代二元切分 不需要词典不根据语义EXP:我们的祖国 - 我们 |们的|的祖| 祖国 检索出现找不到的情况蛮多3:
6、pangu 分词采用地点和统计结合的分词算法。4: paoding5: LibMMseg 是 C 为 sphinx 全文搜索引擎设计的中文分词软件包。6: imdict-chinese-analyzer 是 imdict 智能词典的智能中文分词模块。基于 HMM 模型。是ictclas 的重新实现。7: mmseg4j 利用 MMSEG 算法 实现的中文分词器 并实现 lucene 和 solr。采用两种非此方法,都是基于正向最大匹配。8:结巴分词9: ICTCLAS 中科院分词工具基于算法的分词是不必要维护词库的,但是词库法则必须维护词库,短语在不断的发展。实际上现在许多著名的搜索引擎都采用
7、了多种分词方法,并且有基于统计学的新词识别,自动维护词库等功能。检索引擎:solr 或者 Elasticsearch 服务 spnix Coreseek MYSQL 全文检索实例L+pangu 分词实现的全文检索 分词可以换成 CJKkAnalyzer 或者 IKAnalyzer 我查的资料是现在 mysql 的全文索引对中文还是不支持的,如果想要实现可以采用将内容转换为拼音存储,然后关键字转换为拼音检索,或者将内容进行分词,把分词后的保存一份,将检索条件分词,在分词后的内容中查找。用第三方实现:Demo:MYSQL57+EF6 出现的BUG 的解决方案:如果上面方法不好使:这个 BUG 到
8、 5.7.11 依旧没修复。Mysql 建立好数据库之后,引用了 mysql.data 和 mysql.data.entity 两个 bll 文件。构建Mysql 的实体框架。获得 model,在此过程中出现上述错误。按照上述解决方案修改。MYSQL 全文检索解决方案:大数据量的全文检索一般都会用到 MySQL 的 FULLTEXT 全文索引,通过 SELECT.MATCH.AGAINST 语句来进行查找。迄今为止,MySQL 对中文全文索引无法正确支持, MySQL 是不会识别中文词语的。参照 MySQL 识别英文单词机制,要建立中文全文索引,暂时的解决方案只有手动将中文分词(以空格的形式将
9、中文词语分开),来将中文转换成 MySQL 认识的语言。如今网上对于中文分词的解决方案有很多,有基于 MySQL 插件的,有谈论算法思想的。基于插件(如海量科技的 MySQL-LinuxX86-Chinese+,hightman 开发的 mysql-ft-hightman)的方式主要通过对 MySQL 数据库安装一个别人提供好的插件,在建 FULLTEXT 索引的字段时后面加上 WITH PARSER (大多都是这样)的形式。而基于算法思想的则大部分工作都要自己完成,但他们的大体思想都差不多:1. 对插入的要建全文索引的中文数据进行分词;2. 将原始数据和分词后的数据都存入数据库中,并以某种方
10、式建立联系;3. 在存储分词数据的字段上建立 FULLTEXT 索引;4. 查询时以 SELECT.MATCH.AGAINST 的方式在分词字段上搜索,将搜到的行通过前面建立的联系找到原始数据行并返回。还可以在将分词之后的词组拿过来通过一定的编码方式 比如比如 base64 编码、urlencode 编码等,汉字转拼音等 将转好的存到数据库内,搜索条件进行同样的处理之后和数据库中已存的进行比较。MySQL 中文全文检索 一、概述MySQL 全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。二、语法MATCH (col1,col2,.) AGAINST
11、(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 索
12、引)。三、检索方式1、自然语言检索: IN NATURAL LANGUAGE MODE2、布尔检索: IN BOOLEAN MODE剔除一半匹配行以上都有的词,譬如说,每个行都有 this 这个字的话,那用 this 去查时,会找不到任何结果,这在记录条数特别多时很有用,原因是数据库认为把所有行都找出来是没有意义的,这时,this 几乎被当作是 stopword(中断词) ;但是若只有两行记录时,是啥鬼也查不出来的,因为每个字都出现 50%(或以上),要避免这种状况,请用 IN BOOLEAN MODE。 IN BOOLEAN MODE 的特色: 不剔除 50%以上符合的 row。 不自动以相
13、关性反向排序。 可以对没有 FULLTEXT index 的字段进行搜寻,但会非常慢。 限制最长与最短的字符串。 套用 Stopwords。 搜索语法规则:+ 一定要有(不含有该关键词的数据条均被忽略 )。 - 不可以有 (排除指定关键词,含有该关键词的均被忽略)。 提高该条匹配数据的权重值。 banana orange) IN BOOLEAN MODE);返回必须同时包含“apple banana”或者必须同时包含“apple orange”的记录。若同时包含“apple banana”和“apple orange”的记录,则“apple banana”的权重高于“apple orange”
14、的权重。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、预设搜寻是不分大小写,若要分大小写,column
15、e 的 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