Lucene 01 - 初步认识全文检索和Lucene

1 搜索简介

1.1 搜索实现方案

(1) 传统实现方案

根据用户输入的关键词(java), 应用服务器使用SQL语句查询数据库, 将查询到的结果返回给用户.

特点: 如果数据量很大, 用户量大, 数据库服务器压力随之增大, 导致查询速度变慢.

(2) Lucene实现方案

根据用户输入的关键词(java), 应用服务器通过Lucene提供的API查询索引库, 索引库返回搜索结果给应用服务器, 服务器再将查询到的结果返回给用户

特点: 解决数据量大、用户量大、业务系统对查询速度要求高的业务需求(如实时查询).

1.2 数据查询方法

1.2.1 顺序扫描法

举例: 有多个文件A、B、C...要求找出文件内容包含有关键字[java]的所有文件.

顺序扫描法的思路: 从A文件开始扫描查找, 再扫描B文件...一直扫描完最后一个文件, 才能得到所有包含了java内容的文件.

特点: 文件数量越多, 查找起来就很慢.

1.2.2 倒排索引法(反向索引)

举例: 使用新华字典查找汉字, 先找到汉字的偏旁部首, 再根据偏旁部首对应的页码找到目标汉字.

以Lucene为例建立倒排索引:

文件一(编号是1): we like java java java

文件二(编号是2): we like Lucene Lucene Lucene

term(doc, freq)(pos)
we(1, 1) (2, 1)(0) (0)
like(1, 1) (2, 1)(1) (1)
java(1, 3)(2, 3, 4)
Lucene(2, 3)(2, 3, 4)

说明:

  • 倒排索引就是建立词语与文件的对应关系(词语在什么文件出现, 出现了多少次, 在什么位置出现);
  • 搜索时, 根据用户输入的关键词, 直接在索引中进行查询, 速度更快.

1.3 搜索技术应用场景

(1) 单机软件搜索(Office, Eclipse...);

(2) 站内搜索(京东, 淘宝);

(3) 垂直搜索(限定行业搜索, 如: 医疗, 教育);

(4) 平台搜索(Google, 百度, 360, 搜狗).

2 Lucene简介

2.1 Lucene是什么

Lucene官网: http://lucene.apache.org/

Lucene是Apache软件基金会下的一个子项目, 是一个成熟、免费、开源的全文检索引擎工具包. 它提供了一套简单易用的API, 方便在目标系统中实现全文检索功能. 目前已有很多应用系统的搜索功能是基于Lucene来实现, 如Eclipse帮助系统的搜索功能.

Lucene能够为文本类型的数据建立索引, 只需要把数据转换成文本格式, Lucene就可以对文档进行索引和搜索. 比如常见的word文档、html文档、pdf文档, 首先将文档内容转换成文本格式, 交给Lucene进行索引, 把建立好的索引保存在硬盘或者内存中. 然后根据用户输入的查询条件, 在索引文件中查找, 将查询结果返回给用户.

2.2 全文检索是什么

计算机通过索引程序扫描文章中的每一个词, 对它们建立索引, 指明该词在文章中出现的次数和位置. 当用户查询时, 检索程序根据建立好的索引进行查找, 并将查询结果返回给用户.

2.3 Lucene与搜索引擎的区别

Lucene是一个用于实现全文检索的工具类库, 相当于汽车的发动机;

搜索引擎是基于全文检索, 独立运行的软件系统, 相当于汽车.

3 全文检索流程

3.1 索引和检索流程图

3.2 索引流程

(1) 原始数据

保存在关系数据库中的数据, 存放在硬盘上的文件, 网络上的网页文件等都可作为原始数据.

(2) 获取文档

通过JDBC操作数据库获取关系数据库中的数据, 通过IO操作获取硬盘上的文件, 通过爬虫(蜘蛛)程序获取网络上的网页文件.

信息采集开源软件

  • Solr, 是Apache的一个子项目, 是一个独立的企业级搜索应用服务器, 对外提供类似于Web-service的API, 用户可通过HTTP请求, 向搜索引擎服务器提交一定格式的XML文件, 也可通过HTTP的Get操作提出查询请求, 并得到XML格式的返回结果 -- 支持从关系数据库、xml文档中提取原始数据.

  • Nutch, 是Apache的一个子项目, 包括大规模爬虫工具, 能够抓取和分辨Web网站数据.

  • jsoup, 是一款Java编写的HTML解析器, 可直接解析某个URL地址、HTML文本内容. 它提供了一套非常省力的API, 可通过DOM, CSS以及类似于jQuery的操作方法来获取和操作数据.

(3) 建立文档对象

文档(Document)对象, 相当于关系型数据库中的一条记录;

一个文档对象可以包含多个域(Field), 域相当于数据库表中的一个字段.

(4) 分析文档取得关键词

将原始数据转换成文档对象, 使用分析器(分词器)对文档对象的域中的内容切分成一个个词语, 方便后续建立索引.

(5) 建立倒排索引

建立词语与文档的对应关系(词语在什么文档出现, 出现了多少次, 在什么位置出现), 将其保存到索引库中.

3.3 检索流程

(1) 用户

用户可以是自然人, 也可以是程序.

(2) 用户查询

说明: 需要为用户提供一个输入关键词的界面, 如:

(3) 建立查询对象

说明: 根据用户输入的关键词, 建立查询对象(Query), Query对象会生成查询的语法.

如: bookName:Java, 表示查询图书名称域中含有Java相关的内容.

(4) 执行查询

说明: 根据建立的查询对象, 以及生成的查询语法, 在索引库中查找目标内容, 将查询结果返回给用户.

(5) 返回查询结果

说明: 提供一个友好的搜索结果显示页面(如对搜索结果进行排序显示,关键词高亮显示等).

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

转载于:https://www.cnblogs.com/shoufeng/p/9349440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值