最近在项目中用到了solr,查阅资料知道solr是基于Lucene实现了。本着刨根问底的精神,来研究一下Lucene
Lucene是apache下的一个开源的全文本搜索引擎包。他为开发人员提供了一个简单工具包,以方便在目标系统中实现全文本搜索的功能
有人可能要说了,不就是搜索吗,我直接用模糊查询在数据库查询它不香吗?
其实在数据量比较小的时候用sql实现搜索功能也无大碍,但是当数据量很大的时候数据库的压力就会非常大,而且模糊查询无法使用索引,所以必须全表查询,具体的缺点如下
SQL只能对数据库表进行搜索,不能直接针对硬盘上的文件进行搜索
SQL没有相关度排名
使用模糊查询的时候是对全表的遍历,效率低下
当数据库不在本地的时候,查询非常慢
所以很多的项目中实现搜索功能都是使用第三方的搜索工具,比如solr等。Lucene并不是搜索服务器,它不能单独的运行,它只是一个工具包,为用户提供一系列的api去调用。而很多的第三方的搜索工具就是封装扩展了Lucene而实现的,所以学习Lucene还是很有必要滴。前不久托朋友搞到了一份阿里架构师耗时一年整理的《Lucene高级学习文档》,在这里分享给大家
内容结构分为13个部分。
目录如下:
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
全文检索技术应用场景
计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
Lucene官网
搜索流程
搜索流程
Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。
Field修改
管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用lucene搜索图书信息,需要在数据库表book信息变化时及时更新lucene索引库。
删除索引
在对Document中的内容进行索引之前,需要使用分词器进行分词 ,分词的目的是为了搜索。分词的主要过程就是先分词后过滤。
第三方中文分词器
QueryParser支持默认搜索域,第-个参数为默认搜索域.如果在执行parse方法的时候,查询语法中包含域名则从指定的这个域名中搜索,如果只有查询的关键字,则从默认搜索域中搜索结果.
組合搜索
配置文件
业务代码
词典的构建
confifig.setMaxBufffferedDocs(100000); 控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度。(数值越大索引速度越快, 但是会消耗更多的内存)
indexWriter.forceMerge(文档数量); 设置N个文档合并为一个段(数值越大索引速度越快, 搜索速度越慢; 值越小索引速度越慢, 搜索速度越快)
搜索api的选择
Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。