全文检索
全文检索
1. 课程目标
- 什么是全文检索技术
- 想明白字典的出现是为了什么
- 全文检索可以用来做什么
- 搜索引擎
- 站内搜索
- 有哪些主流的Java全文检索技术
- Lucene
- Solr : 基于lucene,简化开发,提升性能,solr clod实现分布式搜索
- Elastic Search 基于Lucene,更倾向于实时搜索
- 这些技术如何选择
- 搞清楚每个技术的特点及缺点
- 分别学习不同的全文检索技术
2. 什么是全文检索
数据分为两种:
- 结构化数据
- 非结构化数据
非结构化数据又有一种叫做全文数据。
按照数据的分类,搜索分为两种:
- 结构化数据搜索 : SQL
- 非结构化数据 :百度 Google
非结构化数据搜索的主要两种方法:
- 顺序扫描 : 顺序扫描文档,看看是否有关键字。根据文档找词
- 反向索引 : 将搜索的关键字建成索引,然后根据索引查找文档。
这种先建索引,再对索引进行搜索的过程叫做全文检索。
2.1 全文检索场景
- 搜索引擎
- 站内搜索
- 系统文件搜索
2.2 全文检索相关技术
- Lucene 如果使用该技术,需要对Lucene的API和底层原理非常了解,
- Solr 使用Java实现的一个Web应用,可以使用Rest方式的http请求。进行远程API’调用
- Elastic Search rest方式http请求。
3. Solr 和 ES 对比
3.1 检索速度
- 单纯的对已有数据进行搜索时,Solr会更快
- 随着数据量的增加,solr的效率会变低,而ES没有明显的变化。
- Solr 转到 ES 平均才会查询速度提升。
- 实时建立索引时,Solr会产生IO阻塞,查询性能较差。
3.2 总结
- 安装简单
- 支持集群。Solr利用Zookeeper集群管理。ES自带分布式协调工具。
- Solr支持更多数据支持,ES仅支持JSON格式。
- Solr官方提供的功能更多,ES专注核心功能。
- Solr在传统的搜索应用中好于ES。但是在处理实时搜索的应用效率低于ES
3.3 实时搜索和传统搜索
- 传统搜索是静态数据。
- 实时搜索,搜索结果是实时变化的。
4. 全文检索的流程
-
索引库 : 由一个文件目录来表示,存在一堆文件。索引库是如何存储的
-
索引流程:
-
- 采集源数据。
- 索引创建
-
-
搜索流程
- 用户查询条件
- 搜索索引
- 返回搜索结果
4.1 索引库如何存储
4.2 索引如何创建
1.准备要索引的文档
文件一:Students should be allowed to Go out with their friends, but not allowed to drink beer.
文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
2. 将文档传入Tokenizer
- 把文档分成单独的词
- 去除标点符号
- 去除stop word
- 得到token(词元)
“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”
3. 将token传入语言处理组件
- 大写变小写
- 复数变单数
- 过去式等变为一般现在时
- 得到term
“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”
4. 将得到的term传入索引组件
- 利用得到的词创建字典
Term | Document ID |
---|---|
student | 1 |
allow | 1 |
go | 1 |
their | 1 |
friend | 1 |
allow | 1 |
drink | 1 |
beer | 1 |
my | 2 |
friend | 2 |
jerry | 2 |
go | 2 |
school | 2 |
see | 2 |
his | 2 |
student | 2 |
find | 2 |
them | 2 |
drink | 2 |
allow | 2 |
-
按照字典进行排序
-
合并相同的Term成为文档倒排链表
4.3 索引的搜索如何完成
1. 用户输入
lucene AND learned NOT hadoop
2. 语法分析
3. 语言处理
4. 搜索索引
- 找出包含lucene,learn,hadoop的文档链表
- 对lucene和learn的链表进行合并,得到既包含lucene又包含learn的文档链表
- 将上一步的链表与hadoop链表做差
5. 根据文档和查询语句的相关性对结果进行排序。
- Term Weight : Term在此文档中出现了多少次。tf 越大说明越重要。
- Document Weight : 有多少文档包含次Term。df 越大说明越不重要。