Lucene学习


Lucene学习


正文

Lucene['lusen]最初是由Doug Cutting开发的,早先发布在作者自己的博客上,他贡献出Lucene的目标是为各种中小型应用程式加入全文检索功能。 后来发布在SourceForge的网站上提供下载。在2001年9月作为高质量的开源Java产品加入到Apache软件基金会的 Jakarta家族中。 随着每个版本的发布,这个项目得到明显的增强,也吸引了更多的用户和开发人员。

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎, 而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。 Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。 在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。 人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene作为一个全文检索引擎,其具有如下突出的特点:

  1. 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。

  2. 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。

  3. 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。

  4. 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。

  5. 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力, Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。

面对已经存在的商业全文检索引擎,Lucene也具有相当的优势:

  1. 它的开发源代码发行方式

  2. Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构

  3. 转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能

Lucene基本原理

Lucene 采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。

核心模块

Lucene 的写流程和读流程:

其中,虚线箭头(a、b、c、d)表示写索引的主要过程,实线箭头(1-9)表示查询的主要过程。

Lucene 中的主要模块及模块说明如下:

analysis:主要负责词法分析及语言处理,也就是我们常说的分词,通过该模块可最终形成存储或者搜索的最小单元 Term。

index 模块:主要负责索引的创建工作。

store 模块:主要负责索引的读写,主要是对文件的一些操作,其主要目的是抽象出和平台文件系统无关的存储。

queryParser 模块:主要负责语法分析,把我们的查询语句生成 Lucene 底层可以识别的条件。

search 模块:主要负责对索引的搜索工作。

similarity 模块:主要负责相关性打分和排序的实现。

核心术语

Term:是索引里最小的存储和查询单元,对于英文来说一般是指一个单词,对于中文来说一般是指一个分词后的词。

词典(Term Dictionary,也叫作字典):是 Term 的集合。词典的数据结构可以有很多种,每种都有自己的优缺点。

比如,排序数组通过二分查找来检索数据:HashMap(哈希表)比排序数组的检索速度更快,但是会浪费存储空间。

FST(finite-state transducer)有更高的数据压缩率和查询效率,因为词典是常驻内存的,而 FST 有很好的压缩率, 所以 FST 在 Lucene 的最新版本中有非常多的使用场景,也是默认的词典数据结构。

倒排序(Posting List):一篇文章通常由多个词组成,倒排表记录的是某个词在哪些文章中出现过。

正向信息:原始的文档信息,可以用来做排序、聚合、展示等。

段(Segment):索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在 Luence 中的段有不变性, 也就是说段一旦生成,在其上只能有读操作,不能有写操作。

倒排索引

反向索引又叫倒排索引,是根据文章内容中的关键字建立索引。

搜索引擎原理就是建立反向索引。

Elasticsearch 在 Lucene 的基础上进行封装,实现了分布式搜索引擎。

Elasticsearch 中的索引、类型和文档的概念比较重要,类似于 MySQL 中的数据库、表和行。

Elasticsearch 也是 Master-slave 架构,也实现了数据的分片和备份。

Elasticsearch 一个典型应用就是 ELK 日志分析系统。

ElasticSearch

Lucene是一个库,必须要懂一点搜索引擎原理的人才能用的好,所以后来又有人基于 Lucene 进行封装,写出了 Elasticsearch。

MySQL 索引

下面看一下MySQL InnoDB 引擎 索引实现的算法。

假设由我们自己来设计 MySQL 的索引,大概会有哪些选择呢?

  1. 散列表

  2. 有序数组

  3. 平衡二叉树

  4. 跳表

  5. B+ 树

Lucene查询语法

Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询。

  • Terms词语查询

  • Field字段查询

  • Term Modifier修饰符查询

WildCard Searches通配符查询

支持在单个单词或者语句中添加通配符:

?匹配单个字符

*匹配0个或多个字符

  • Fuzzy Searches模糊词查询

支持搜索模糊词,如果想要搜索模糊词,需要在词语后面加上符号~

Proximity Searches邻近词查询

  • Range Searches范围查询

支持范围搜索,可以指定最小值和最大值,会自动查找在这之间的文档。如果是单词,则会按照字典顺序搜索。

{}尖括号表示不包含最小值和最大值,可以单独使用

[]方括号表示包含最小值和最大值,可以单独使用

  • Boosting a Term词语相关度查询

如果单词的匹配度很高,一个文档中或者一个字段中可以匹配多次,那么可以提升该词的相关度。使用符号^提高相关度。

  • Boolean Operator布尔操作符

AND &&

OR ||

NOT && !

+

-

  • Grouping分组

()

  • Escaping Special Character转义字符

\






参考资料

Lucene知乎 https://www.zhihu.com/topic/19584038/top-answers

Lucene百度 https://baike.baidu.com/item/Lucene/6753302?fr=aladdin

终于有人把Elasticsearch原理讲透了 https://zhuanlan.zhihu.com/p/62892586

掌握它才说明你真正懂Elasticsearch https://zhuanlan.zhihu.com/p/65075215

Elasticsearch查询速度为什么这么快 https://zhuanlan.zhihu.com/p/280676094

Elasticsearch详解 https://www.jianshu.com/p/28fb017be7a7

图解 ElasticSearch 原理 https://zhuanlan.zhihu.com/p/339365195

Lucene查询语法详解 https://www.cnblogs.com/xing901022/p/4974977.html

数据结构与算法 https://www.cnblogs.com/xkzhangsanx/p/10888179.html

掌握它才说明你真正懂Elasticsearch https://zhuanlan.zhihu.com/p/65075215


返回