最近在项目中用到了solr,查阅资料知道solr是基于Lucene实现了。本着刨根问底的精神,来研究一下Lucene
啥是Lucene?
Lucene是apache下的一个开源的全文本搜索引擎包。他为开发人员提供了一个简单工具包,以方便在目标系统中实现全文本搜索的功能
为啥要用Lucene?
有人可能要说了,不就是搜索吗,我直接用模糊查询在数据库查询它不香吗?
其实在数据量比较小的时候用sql实现搜索功能也无大碍,但是当数据量很大的时候数据库的压力就会非常大,而且模糊查询无法使用索引,所以必须全表查询,具体的缺点如下
SQL只能对数据库表进行搜索,不能直接针对硬盘上的文件进行搜索
SQL没有相关度排名
使用模糊查询的时候是对全表的遍历,效率低下
当数据库不在本地的时候,查询非常慢
所以很多的项目中实现搜索功能都是使用第三方的搜索工具,比如solr等。Lucene并不是搜索服务器,它不能单独的运行,它只是一个工具包,为用户提供一系列的api去调用。而很多的第三方的搜索工具就是封装扩展了Lucene而实现的,所以学习Lucene还是很有必要滴。前不久托朋友搞到了一份阿里架构师耗时一年整理的《Lucene高级学习文档》,在这里分享给大家
内容结构分为13个部分。
目录如下:
一、搜索技术理论基础
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
- 为什么要学习Lucene
- 数据查询方法
-
全文检索技术应用场景
二、Lucene介绍
计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
- 什么是全文检索
- 什么是Lucene
-
Lucene官网
三、Lucene全文检索的流程
- 索引和搜索流程图
- 索引流程
-
搜索流程
四、Lucene入门
- Lucene准备
- 开发环境
- 创建Java工程
- 索引流程
- 使用Luke查看索引
-
搜索流程
五、Field域类型
Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。
- Field属性
- Field常用类型
-
Field修改
六、索引维护
管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用lucene搜索图书信息,需要在数据库表book信息变化时及时更新lucene索引库。
- 需求
- 添加索引
- 修改索引
-
删除索引
七、分词器
在对Document中的内容进行索引之前,需要使用分词器进行分词 ,分词的目的是为了搜索。分词的主要过程就是先分词后过滤。
- 分词理解
- Analyzer使用时机
- Lucene原生分词器
-
第三方中文分词器
八、Lucene高级搜索
QueryParser支持默认搜索域,第-个参数为默认搜索域.如果在执行parse方法的时候,查询语法中包含域名则从指定的这个域名中搜索,如果只有查询的关键字,则从默认搜索域中搜索结果.
- 文本搜索
- 數值范围搜索
-
組合搜索
九、搜索案例
- 引入依赖
- 项目加入页面和资源
- 创建包和启动类
-
配置文件
业务代码
十、Lucene底层储存结构(高级)
- 详细理解lucene存储结构
- 索引库物理文件
- 索引库文件扩展名对照表
-
词典的构建
十一、Lucene优化(高级)
-
confifig.setMaxBufffferedDocs(100000); 控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度。(数值越大索引速度越快, 但是会消耗更多的内存)
-
indexWriter.forceMerge(文档数量); 设置N个文档合并为一个段(数值越大索引速度越快, 搜索速度越慢; 值越小索引速度越慢, 搜索速度越快)
- 解决大量磁盘IO
- 选择合适的分词器
- 选择合适的位置存放索引库
-
搜索api的选择
十二、Lucene相关度排序(高级)
Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。
十三、Lucene使用注意事项(高级)
- 关键词区分大小写 OR AND TO等关键词是区分大小写的,lucene只认大写的,小写的当做普通单词。
- 读写互斥性 同一时刻只能有一个对索引的写操作,在写的同时可以进行搜索
- 文件锁 在写索引的过程中强行退出将在tmp目录留下一个lock文件,使以后的写操作无法进行,可以将其手工删除
- 时间格式 lucene只支持一种时间格式yyMMddHHmmss,所以你传一个yy-MM-dd HH:mm:ss的时间给lucene它是不会当作时间来处理的
- 设置boost 有些时候在搜索时某个字段的权重需要大一些,例如你可能认为标题中出现关键词的文章比正文中出现关键词的文章更有价值,你可以把标题的boost设置的更大,那么搜索结果会优先显示标题中出现关键词的文章