我是风月连城,喜欢用简单的语言阐述知识点
长期分享原创java文章,分享进阶架构师学习笔记及学习资料
喜欢的大屌们可以关注下,共同学习,一起进步
ps:由于工资迟迟不发,影响心情,好几天没写文章....
Lucene是什么?
0 ) 关键词:Lucene ,搜索,全文检索
1)本质:一个Jar包,一个用于全文检索的框架
2)作用:Lucene不是一个完整的全文索引应用,而是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。而数据库执行模糊查询都需要对全表扫描或索引扫描意味着消耗大量IO,如果模糊查询经常发生,会造成数据库性能恶化。
3 ) 好处 :
1 . 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
2 . 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
3 . 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
4 . 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
5 . 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。
6 . 开源,可扩展能力强,有各种语言版本,适合各种平台,
4 ) 场景:基于Lucene框架的搜索引擎有很多,如Solr,Elastic Search,Nutch等
5 ) 中文 : 对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
6 ) 主要的包(既然只是个框架,那肯定得介绍里面主要的一些包的作用啦):
7 ) 架构设计(Lucene主要做的两件事):
如图,简单说全文检索大体分两个过程(主要做这两件事),索引创建(Indexing)和 搜索索引(Search)。
一.索引创建入库:文本内容经切词后索引入库 (即通过IndexWriter对不同的文件进行索引的创建,并将其保存在索引相关文件存储的位置中),其入库逻辑大致如下:
1.入库者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让用户通过“站内检索”搜索到相关的网页内容。入库文档结构与关系型数据库中的表结构类似,每个入库的文档由多个字段构成,假设这里需要入库的网站内容包括如下字段:文章标题、作者、发布时间、原文链接、正文内容(一般作为网页快照)。
2. 包含N个字段的文档(DOCUMENT)在真正入库前需要经过切词(或分词)索引,切词的规则由语言分析器(ANALYZER)完成。
3. 切分后的“单词”被注册到索引树上,供查询时用,另外也需要把其它不需要索引的内容入库,所有这些是文件操作均由STORAGE完成。
4. Lucene的索引树结构非常优秀,是Lucene的一大特色。
二.搜索索引:就是得到用户的查询请求,搜索所创建的索引,然后返回结果的过程。大致逻辑如下:
1. 查询者输入查询条件,条件之间可以通过特定运算符进行运算,比如查询希望查询到与“中国”和“北京”相关的记录,但不希望结果中包括“海淀区中关村”,于是输入条件为“中国+北京-海淀区中关村”;
2. 查询条件被传达到查询分析器中,分析器将将对“中国+北京-海 淀区中关村”进行分析,首先分析器解析字符串的连接符,即这里的加号和减号,然后对每个词进行切词,一般最小的词元是两个汉字,则中国和北京两个词不必再 切分,但对海淀区中关村需要切分,假设根据切词算法,把该词切分为“海淀区”和“中关村”两部分,则最后得到的查询条件可以表示为:“中国” AND “北京” AND NOT(“海淀区” AND “中关村”)。
3.查询器根据这个条件遍历索引树,得到查询结果,并返回结果集,返回的结果集(类似于JDBC中的ResultSet)
4. 将返回的结果集显示在查询结果页面
5.需要注意的是,Lucene默认只支持英文,为了便于说明问题,以上查询过程采用中文举例,事实上,当Lucene被扩充支持中文后就是这么一个查询过程。(各种好用的中文词典分词库大家可以自行百度下)
8 ) 原理 : 在Lucene中,就是使用这种“倒排索引”的技术,来实现相关映射。:
9 ) Demo实例 :没有,就是这么任性.快国庆了工资都没发,吃土中...看到这里的大屌们还不关注下?