全文检索

全文检索

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. 全文检索的流程

全文检索

  • 索引库 : 由一个文件目录来表示,存在一堆文件。索引库是如何存储的

  • 索引流程:

      1. 采集源数据。
      2. 索引创建
  • 搜索流程

    • 用户查询条件
    • 搜索索引
    • 返回搜索结果

全文检索

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 越大说明越不重要。