Lucene是什么?
是框架非引擎
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
执行流程
- 创建索引
- 查找索引
适用场景
- 在应用中为数据库中的数据提供全文检索实现
- 开发独立的搜索引擎服务、系统
特性
- 稳定、索引性能高
- 每小时能够索引150GB以上的数据
- 对内存的要求小,只需要1MB的堆内存
- 增量索引和批量索引一样快
- 索引的大小约为索引文本大小的20%~30%
- 高效、准确、高性能的搜索算法
- 良好的搜索排序
- 强大的查询方式支持:短语查询、通配符查询、临近查询、范围查询等
- 支持字段搜索(如标题、作者、内容)
- 可根据任意字段排序
- 支持多个索引查询结果合并
- 支持更新操作和查询操作同时进行
- 支持高亮、join、分组结果功能
- 可扩展排序模块,内置包含向量空间模型、BM25模型可选
- 可配置存储引擎
- 跨平台
- 纯java编写
- 作为Apache开源许可下的开源项目,你可在商业或开源项目中使用
- Lucene有多种语言实现版可选(如C、C++、Python等),不光是Java
分词器
分词器用来分词
原句:
上海自来水来自海上
分词后:
上海,自来水,来自,还是
正向索引
正向索引,简单理解其实就是我们做传统应用时数据库中保存记录的形式,比如:
文章ID | 文章标题 | 文章内容 |
---|---|---|
1 | {上海、自来水} | {来自} |
2 | {上海} | {来自、海上} |
其中{}部分是表示内容中包含的一些关键字。我们很容易发现传统的存储形式是:
id --> 词项
面对这种存储形式,我们查询文章标题或者文章内容中是否包含某个词语的时候,一般只能:
SELECT * FROM TABLE WHERE 文章标题 LIKE '%上海%';
SELECT * FROM TABLE WHERE 文章标题 LIKE '%上海%' OR 文章内容 LIKE '%上海%';
可想而知,在面对大数据的时候,这种查询效率是极其低下的,甚至无法满足一些复杂场景,比如:关键字高亮、偏移量、词频等。这时候就要引入反向索引,专业人做专业事!毕竟数据库比较适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要 实时性。
反向索引
顾名思义,反向索引是正向索引反着来的,以词项为主关联文章ID的形式,如下:
词项 | 标题包含该词的文章id | 内容包含该词的文章id |
---|---|---|
上海 | {1,2} | {1,2,7} |
自来水 | {1,2,3,4} | {1,2,9} |
我们很容易发现这种的存储形式是:
词项 --> id
这种存储的方式可以让我们根据查询的关键字很快的找出对应的文章,甚至还可以满足一些更复杂的场景,比如反向索引还可以记录词项出现的次数、出现的位置,如下:
词项 | 标题包含该词的文章id | 内容包含该词的文章id |
---|---|---|
上海 | {{1,1,{0}},{2,2,{0,4}}} | {{7,2,{1,6}} |
自来水 | {{3,2,{1,5}},{4,1,{2}}} | {{2,1,{0}},{9,3,{1,5,9}}} |