关于Lucene的学习

Lucene详解

Lucene是一种高性能、可伸缩的信息搜索库,是基于Java实现的高性能的开源项目。Lucene采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。

核心模块

Lucene主要有6个核心模块:

  1. analysis :分词模块,对语句进行分词处理,可形成搜索或者查询的最小单元term;
  2. index:索引创建模块,主要负责索引的创建;
  3. store:主要负责索引的读写,以及对文件的一些操作,其主要目的是抽象出和平台文件系统无关的存储;
  4. queryParser:语法分析模块,将语句转化成Lucene能够执行的条件;
  5. search:搜索模块,主要负责对索引的搜索;
  6. similarity:主要负责相似度评分和排序的实现;

核心术语

  1. Term :作为存储或者查询当中的最小单元,英文一般表示一个单词,中文一般标识分词后的一个词;
  2. 词典(Term Dictionary,也叫作字典):是Term的集合。词典的数据结构可以有很多种,每种都有自己的优缺点,比如:排序数组通过二分查找来检索数据:HashMap(哈希表)比排序数组的检索速度更快,但是会浪费存储空间;fst(finite-state transducer)有更高的数据压缩率和查询效率,因为词典是常驻内存的,而fst有很好的压缩率,所以fst在Lucene的最新版本中有非常多的使用场景,也是默认的词典数据结构
  3. 倒排序(Posting List):倒排表记录该词在哪些文章中出现过;
  4. 正向信息:原始的文档信息,可以用来做排序、聚合、展示等;
  5. 段(segment):索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在Lucene中的段有不变性,也就是说段一旦生成,在其上只能有读操作,不能有写操作。

检索方式

Lucene中的查询方式主要有四种:

  1. 单词查询:指的是对一个Term进行查询,在倒排表中获取对应的文档链表。
  2. AND查询:指的是多个查询条件取交集。
  3. OR查询:指的是多个查询条件取并集查询
  4. NOT查询:指的是查询不包含某些条件的结果

由于Lucene采用倒排索引的方式存储数据,我们在进行查询的时候,首先通过Term获取文档链表,再将查询出来的这些链表进行交集、并集、差集操作,可以准确的获取结果,相比较于关系型数据库的like查询全表扫描操作,这种查询是非常高效的。

分段存储

在早期的全文检索中为整个文档集合建立了一个很大的倒排索引,并将其写入磁盘中,如果索引有更新,就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大时效率很低,并且由于创建一次索引的成本很高,所以对数据的更新不能过于频繁,也就不能保证实效性。

现在,在搜索中引入了段的概念(将一个索引文件拆分为多个子文件,则每个子文件叫做段),每个段都是一个独立的可被搜索的数据集,并且段具有不变性,一旦索引的数据被写入硬盘,就不可修改。

在分段的思想下,对数据写操作的过程如下:

  1. 新增操作:当有新的数据需要创建索引时,由于段的不可变性,会创建一个新的段进行存储。
  2. 删除操作:当删除数据时,由于其所在的段只可读不可写,所以会创建一个.del文件用来存储删除数据的id。当进行查询时,已删除的数据仍可被查询到,但是会在进行文档链表合并的时候将这些数据移除(被删除的数据在进行段合并时才会被真正被移除)。
  3. 修改操作:更新操作实际上是新增和删除操作的集合,现在.del文件中记录旧的数据,再新增一个段存储更新后的数据。

段不可变性优点

  • 不需要锁:不会出现更新数据的情况,线程安全
  • 常驻内存:段在被加载到内存后,由于具有不变性,所以只要内存的空间足够大,就可以长时间驻存,大部分查询请求会直接访问内存,而不需要访问磁盘,使得查询的性能有很大的提升。
  • 增量创建:由于分段可以做到增量创建索引,轻量级的对数据进行更新,所以可以进行频繁的更新操作,让系统接近实时更新。

段不可变性缺点

  1. 删除:旧的数据并不会立刻删除,只能等到段更新的时候才能被真正的移除。
  2. 更新:更新伴随着新增和删除两个操作,若一条数据进行频繁的更新,则会有大量的空间浪费。
  3. 新增:每次新增都会新建段,段的数量太多对服务器资源消耗大,可能影响查询性能。
  4. 过滤:查询时需要对已删除的数据进行过滤,影响查询的性能。

写索引的流程如下

  1. 新数据进行写入时,并没有立即写入硬盘,而是暂存在内存中,Lucene默认时一秒钟或者达到一定数量再批量写入硬盘,参数可以控制,可通过延迟写策略提高性能。
  2. 在达到出触发条件以后,会将内存中缓存的数据一次性写入磁盘中,并生成提交点。
  3. 清空内存,等待新的数据写入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值