🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#全文检索原理 ##数据查询 1. 结构化数据,有固定格式或有限长度 账号、密码、分数等 一般通过关系型数据库存储和查询,建立索引 2. 非结构化数据,不定长或无固定格式数据 邮件内容、word文档 可以通过顺序查找,例如windows搜索和linux grep ##全文检索原理 ###把非结构化数据转变成结构化数据,分2大部分: * 索引:把非结构化数据分解,创建词的索引 反向索引?倒排表? * 搜索:只需在创建的索引里直接获取而不需扫描原文 关键在于排序 ![](https://box.kancloud.cn/2016-05-05_572abe6ace48b.png) ![](https://box.kancloud.cn/2016-05-05_572abe6b11bd3.png) ###词法分析和语法分析 **分词(Tokenizer):** a)单词 b)去标点 c)停词(词元Token) d)小写、词根(词Term) 语法分析: '+ - or ””site link **关于中文分词:** a)二分法 b)词典法 c)最短匹配、最长匹配 d)复合分词 ![](https://box.kancloud.cn/2016-05-05_572abe6b68524.png) ![](https://box.kancloud.cn/2016-05-05_572abe6bd4ca5.png) ##爬虫协议 rebots.txt User-agent: * Disallow: /reg/ Allow: /*.html* Disallow: /*php?* #解决方案之SQL全文索引 ##全文检索解决方案 1. 关系型DB全文索引:MySQL FULLTEXT 不需要额外开发,功能受限 2. 脚本语言SQL结合全文检索:Sphinx Xunsearch 与SQL和脚本语言结合紧密,性能好 3. 完全定制全文检索lucene 功能强大,开发量大 4. 网络爬虫与搜索:Nutch与Solr 直接使用,适合简单快速获取信息 ##MySQL全文索引示例 语法: 索引:fulltext key(field) 查询:where MATCH(field) AGAINST(‘word’) 配置: MyISAM: ft_min_word_len、ft_max_word_len ft_stopword_file ft_query_expansion_limit:使用with query expansion进行全文索引的最大匹配数 InnoDB:innodb_ft_min_token_size ##三种查询模式: 1. NATURAL LANGUAGE MODE 默认自然语言模式,多于50%忽略、相关性排序 2. BOOLEAN MODE 不排序、无限制,可以有语法 3. WITH QUERY EXPANSION 自然语言模式的二次查询 ##MySQL全文索引限制 1. 只有MyISAM表支持(5.6以后innodb也支持),只支持char、varchar、text列 2. 对大多数的多字节字符集适用,索引列必须使用相同的字符集和校验码(collation)。 3. 表意性语言,如汉语、日语没有词分界符,全文检索不支持。 4. 自然语言检索必须对检索列单独建全文索引,布尔检索可以在非索引的列上进行,但 会慢一些。 5. against后的参数必须是常量字符串。 6. 索引没有记录关键词在字符串中的位置,排序算法太单一。 7. 索引不在内存中检索速度会很慢。索引有碎片时也会很慢,所以需要更频繁的 optimize table操作。 8. 全文索引对于insert、update、delete都很慢。 ##MySQL全文索引中文分词解决办法 1. mysql插件 编译模块或动态加载插件 mysqlcft 2. 简单解决 a)增加一个字段建立全文索引 b)程序里分词后存入这个冗余字段(有php库和模块) c)要全文检索时就查询这个冗余字段 #Sphinx与MySQL全文检索 ##大数据量全文检索 1. 大数据量采用独立搜索引擎 2. 对关系型DB建立索引,只存储id 3. 查询时先从搜索引擎查询出id 4. 再根据id到关系型DB查询其他数据 ##Sphinx & Coreseek 1. 和sql、脚本语言php等结合紧密 2. 索引搜索性能高 3. Coreseek基于Sphinx加入中文分词 ##Coreseek安装与使用 安装:http://www.coreseek.cn 特别说明: 1. xml运行需要expat expat-devel 2. src/Makefile少了参数 -liconv 其他按官网简单说明,安装mmseg中文分词,安装coreseek程序 testpack下有索引、搜索示例: mmseg分词 index索引 search查询 searchd守护进程 有php和py的api封装 php调用示例: /usr/local/coreseek/bin/searchd -c etc/quanzhan.conf php api/test.php 全栈工程师 ##讯搜 安装:http://www.xunsearch.com 索引设计基于Xapian 中文分词scws php SDK ![](https://box.kancloud.cn/2016-05-05_572abe6c3bbca.png) #Lucene Api调用 ##Lucene资料 1. http://lucene.apache.org/ 只是工具Api 2. 开源早、资源占用少、性能高、java跨平台、Api简单易用、翻译成多种 语言版本 3. 基于Lucene的众多应用封装 Solr:和lucene同步,搜索完全实现,提供多种格式接口,web管理界面 Nutch:高效爬虫,和Solr完全兼容 Compass:数据库映射、事务管理 Elastic Search:分布式RESTful风格接口 ##Lucene开发 API开发,索引的原理 问题: 1. 多次索引会重复吗? 2. 如何更新和删除? 3. 多字段如何搜索? 4. 排序、与、或等条件搜索? 5. 如何自动触发索引? 6. 跨语言如何调用? #Solr与Nutch集成 ##什么是Solr与Nutch 1. 不需要开发代码,不需要了解Lucene及接口 2. Solr完成专业搜索封装及http接口 3. Nutch爬虫定制抓取数据只需要简单配置 版本: a)Solr 4.10,与Lucene同步 b)nutch分1.X系列(更稳定高效,更新频繁)和2.X系列(抽象数据层实现多种方式) 集成问题:都是apache项目,采用Lucene版本不同但问题不大,修改字段配置即可 集成方法:Nutch爬虫入库直接指定Solr地址 ##Nutch使用 1. 创建种子库 urls/seed.txt 和数据目录 data 2. 配置规则 a)设置爬虫名 conf/nutch-site.xml 加入http.agent.name属性 b)设置匹配规则 conf/regex-urlfilter.txt 修改+^http://www.ucai.cn/ 3. 开始抓取数据,运行参数 bin/crawl urls data null 2 4. 查询数据情况、分析、导出 bin/nutch readdb data/crawldb/ -stats ![](https://box.kancloud.cn/2016-05-05_572abe6c7da41.png) ##Solr使用 1. 配置 scheme.xml a)fieldType 定义了如何处理field b)field 索引文件中能提交处理的字段 2. 配置 solrconfig.xml lib配置、依赖jar包和插件、组件配置、索引配置、查询配置使用: 启动jetty容器:java -jar start.jar 多core配置 ##集成方法 Nutch爬虫直接入库Solr(已经抓取的可以用命令工具bin/nutch index入库) bin/crawl urls data http://localhost:8983/solr/ucai 1 配置: 1、复制Nutch字段配置到Solr:{nutch_dir}/conf/scheme-solr4.xml到 {solr_dir}/solr/ucai/conf/scheme.xml 2、加入版本字段到最后:<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>