#全文检索原理
##数据查询
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"/>
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密