Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索,在Java开发环境里Lucene是一个成熟的免费开放源代码工具;就其本身而论,Lucene是现在并且是这几年,最受欢迎的免费Java信息检索程序库。--维基百科
前言
Lucene的特性
1.稳定、索引性能高
- 每小时能够索引150GB以上的数据
- 对内存的要求小——只需要1MB的堆内存
- 增量索引和批量索引一样快
- 索引的大小约为索引文本大小的20%~30%
2.高效、准确、高性能的搜索算法,
- 良好的搜索排序。
- 强大的查询方式支持:短语查询、通配符查询、临近查询、范围查询等。
- 支持字段搜索(如标题、作者、内容)。
- 可根据任意字段排序
- 支持多个索引查询结果合并
- 支持更新操作和查询操作同时进行
- 支持高亮、join、分组结果功能
- 速度快
- 可扩展排序模块,内置包含向量空间模型、BM25模型可选
- 可配置存储引擎
3.跨平台,纯java编写。Lucene有多种语言实现版可选(如C、C++、Python等),不光是JAVA。
1. Luncene重要性
版本更新的非常快,现在最新的版本已经是7.2.1,已经成为搜索引擎的内核。你熟悉的solr、elasticsearch都有基于它实现。他们关系就好似发动机与汽车,了解发动机能够让你更好的驾驭solr、elasticsearch。
2. 版本迭代
Apache Lucene 官方介绍已经很详细了,最新版本为7.5.0(2018-9),这里主要介绍下lucene 7.4新增特性:
Analysis
- 韩国analyzer
- 使用ICUTokenizer支持表情序列令牌
Queries
- 新的IntervalQuery实现了基于最小间隔语义的邻近搜索
- 由于Weight#matches API,查询现在可以迭代给定文档上的位置和匹配
Indexing
- 具有可配置保留策略的新软删除机制
- Doc-value 更新可以重置值
- Doc-values 可以用常规文档更新自动更新
Highlights of this Solr release include:
- A new 'relatedness()' aggregate function for JSON Faceting to enable building Semantic Knowledge Graphs.
- Added the TaggerRequestHandler (AKA SolrTextTagger) for tagging text. It's used as a component of NER/ERD systems including query-understanding.
- The "Auto Scaling" feature area has been added to and enhanced a lot.
- The "Streaming Expressions" feature area has been added to and enhanced a lot.
- Upgraded from Log4j 1.x to 2.x. Solr continues to log via SLF4J.
为何要专门讲7.4呢?主要是与后续将要分享elasticsearch6.4相呼应。
3. 为什么需要搜索引擎
- 传统的关系型数据库针对文本列的索引失效问题(也不适合建索引),比如我们查询标题 LIKE ‘%钓鱼岛%’会导致Like 时索引失效,全表扫描,数据量大时是噩梦
- 查询出来的结果进行相关度排名,传统的关系型数据库做到会比较吃力
- 数据结构的多样性支持,结构化数据(用表、字段表示的数据)->半结构化数据(xml 、html)->非结构化数据(文本、文档、图片、音频、视频等)
这两者解决的问题是不一样。数据库搜索在匹配效果、速度、效率等方面都逊色于全文检索。
4. 适用场景
核心:大量结构化、半结构化、非结构化文本类数据的实时搜索
- 网页搜索
- 内容提供网站的内容搜索(如 新闻、论坛、博客网站)
- 电子商务网站的商品搜索
- 如果你负责的系统数据量大,通过数据库检索慢,可以考虑用搜索引擎来专门负责检索。
5. 搜索引擎的核心部件
- 数据源
- 分词器
- 反向索引(倒排索引)
- 相关性计算模型
6. 什么是相关度排名
参阅另一篇《相关性》
7. 全文检索是什么
全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,而且所有全文数据库无一不是海量信息数据库。--百度百科
全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。
全面、准确和快速是衡量全文检索系统的关键指标。
我们要知道:
- 只处理文本
- 不处理语义。
- 搜索时英文不区分大小写
- 结果列表有相关度排序。(查出的结果如果没有相关度排序,那么系统不知道我想要的结果在哪一页。我们在使用百度搜索时,一般不需要翻页,为什么?因为百度做了相关度排序:为每一条结果打一个分数,这条结果越符合搜索条件,得分就越高,叫做相关度得分,结果列表会按照这个分数由高到低排列,所以第1页的结果就是我们最想要的结果。)
在信息检索工具中,全文检索是最具通用性和实用性的。
最后,数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。如果想了解的更多,请参阅下章反向索引。