参考
Lucene学习总结之一:全文检索的基本原理
Lucene就是这么简单
Lucene思维导图,让搜索引擎不再难懂
Lucene 是一个高效的,基于Java 的全文检索库。很多检索工具,比如hibernate search、solr、elasticsearch都是基于它封装、扩展出来的。
简单来说,lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码。用 Java 开发的时候,引入 lucene jar,然后基于 lucene 的 api 去开发。
通过 lucene,我们可以将已有的数据建立索引,lucene 会在本地磁盘上面,给我们组织索引的数据结构。
目标数据对象
全文数据(非结构化数据)
- 结构化数据: 指具有固定格式或有限长度的数据,如数据库,元数据等。
- 非结构化数据: 指不定长或无固定格式的数据,如邮件,word文档等。
- 半结构化数据:如XML,HTML等,根据需要可进行不同方式处理。
非结构化数据又叫全文数据。
思想
全文数据的搜索主要有两种方法
- 顺序扫描(Serial Scanning):比如grep
- 建立索引,再对索引进行搜索:全文检索(Full-text Search)
搜索引擎数据的特点:一次写入+基本不会修改+多次查询。而后者也是一次索引,多次使用(即便索引也需要不少时间,但能大大降低查询时间),所以目前商业文本搜索应用都基于此。
使用场景
- google、百度的搜索:全网、利用爬虫
- Lucene:网页内/文件内
均使用倒排索引
与SQL区别,SQL搜索的缺点
- SQL只能针对数据库表搜索,不能直接针对硬盘上的文本搜索
- SQL没有相关度排名
- SQL搜索结果没有关健字高亮显示
- SQL需要数据库的支持,数据库本身需要内存开销较大
- SQL搜索有时较慢,尤其是数据库不在本地时,超慢
- SQL使用的是数据库中的内存,在硬盘中为DBF文件
- Lucene中存的是一系列的二进制压缩文件和一些控制文件,在硬盘上,统称为索引库
基本概念
索引库(Index)
一个目录一个索引库,同一文件夹中的所有的文件构成一个Lucene索引库。类似数据库的表的概念。
lucene的索引实例段(Segment)
Lucene索引可能由多个子索引组成,这些子索引成为段。每一段都是完整独立的索引,能被搜索。
文档(Document)
一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。段是索引数据存储的单元。类似****数据库内的行****或者****文档数据库内的文档****的概念。
域(Field)
一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,作者等。类似于****数据库表中的字段****。
词(Term)
词是索引的最小单位,是经过词法分析和语言处理后的字符串。一个Field由一个或多个Term组成。比如标题内容是“hello lucene”,经过分词之后就是“hello”,“lucene”,这两个单词就是Term的内容信息,当关键字搜索“hello”或者“lucene”的时候这个标题就会被搜索出来。
网友评论