前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

Elasitcsearch 底层系列 Lucene 内核解析之Lucene概览

原创
作者头像
老生姜
修改2018-11-26 11:07:14
1.5K0
修改2018-11-26 11:07:14
举报

1. 背景

1.1 Lucene是什么

       Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。用户可以使用Lucene 或 基于Lucene的成熟产品Nutch/Solr/Elasticsearch等来快速构建搜索服务,如文件搜索、网页搜索等。

1.2 需求

       随着信息量的爆炸式增长,人们开始发明各种各样的方案来对信息进行管理,加快信息获取速度。传统方案如新华字典中的汉语拼音音节索引及部首检字表索引、图书馆使用的杜威十进制分类法( 330.94 表欧洲经济学=330 表经济学+ .9 表地区别论述 + .04 表欧洲)等,互联网时代的方案如Windows资源管理器中的搜索功能、Google、百度等。Lucene也是互联网时代的一种方案,可用于满足大量信息检索场景:

  • 文件搜索:类似GitHub的代码搜索;
  • 网页搜索:各门户网站的站内网页搜索;
  • App搜索:类似App Store支持的应用搜索;
  • 商品搜索:美团内的美食商品搜索。

       但与Windows资源管理器、Google、百度等不同的是,Lucene并不是一个开箱即用型的服务。它面向程序开发者,是一个Java开发的、大小仅2MB左右的类库,专注于信息检索技术的文本索引和搜索功能等通用性部分,而把信息采集处理、用户交互UI、商业逻辑等业务相关性部分交给应用层。

1.3 相关产品

       尽管在Java世界lucene已经是标准的全文检索程序,但是C/C++世界并没有相应的工具。虽然Lucene被广泛移植到其他语言中(C/C++、C#、Python、PHP、Perl等),但其他语言版本的活跃程度一般。Xapian填补了这个缺憾,它的API和检索原理和lucene在很多方面都很相似。

       Lucene另一方面,Lucene仅仅是一个Java类库,对于线上大规模使用,除了需要经过封装开发形成产品外,还需要考虑可靠性、分布式化等问题。因此出现了基于Lucene的产品化系统,例如Nutch、Solr、Elasticsearch等。

1.4 作者

       Lucene的作者Doug Cutting,同时也是Nutch、Hadoop的创始人。

2. 初步使用

       下面通过构造一个简单的文本文件搜索程序,来介绍Lucene的写入(索引流程)、读取(搜索流程)等基本使用。

2.1 索引流程

  • 程序入口:读取dataDir目录下的文件,写入目标目录:
  • 其中,Indexer类构造函数的核心为定义一个Lucene的IndexWriter对象:
  • indexer.index()用于遍历目录下的所有文件,对其中的文本文件建立索引:
  • 其中indexFile为建立索引的核心实现,具体如下:

2.2 搜索流程

  • 程序入口:获取搜索请求
  • 其中,search为搜索文件的核心实现,具体如下:

       到这里,我们仅通过一两百行代码即完成了一个最简单的文本文件搜索功能。

3. 基本原理

       正如前面的文本文件搜索程序所示,Lucene的信息检索功能主要包含两个主要流程:索引 和 搜索。这两部分的整体流程如下:

  • 索引流程
    • 对待索引的文档进行分词处理:(1)
    • 结合分词处理的结果,建立词典表 和 倒排索引:(2)
    • 将倒排索引写入索引存储:(3)、(4)
  • 搜索流程
    • 对用户的查询语句进行词法、语法分析:(a)、(b)
    • 搜索索引得到结果文档集,其中涉及到从索引存储中加载索引到内存的过程:(c)、(d)、(e)
    • 对搜索结果进行排序并返回结果(f)、(g)

       下面我们结合图例,对上述索引、搜索流程进行具体介绍。

3.1 索引流程

3.1.1 分词处理

  • 将待索引的文档传递给分词器进行处理,我们样例程序中的StandardAnalyzer即为标准英文分词器,如果需要中文分词,可以使用开源界贡献的插件或自定义。
  • 分词过程会把文档拆分成一个个独立的词(Term),期间会去除标点符号和停用词(“the”、“this”、“a”...),并对词做小写化等处理。分词后的结果样例如下:

3.1.2 建立词典表 和 倒排索引

  • 对分词的结果进行排序,建立词典列表:
  • 合并相同的词,建立词典表 和 倒排表

3.1.3 存储索引

  • Lucene为了加快索引速度,采用了LSM Tree结构,先把索引数据缓存在内存。
  • 当内存空间占用较高 或 达到时间限制后,内存中的数据会被写入磁盘形成一个数据段(segment),segment实际包含词典、倒排表、字段数据等等多个文件。

3.2 搜索流程

3.2.1 词法、语法分析

  • 对用户的请求语句进行词法、语法分析,生成查询语法树,把文本请求转换为Lucene理解的请求对象。例如对查询“lucene AND Solr”的分析后生成的语法树如下:

3.2.2 搜索索引

  • 按照查询语法树,搜索索引获取最终匹配的文档id集合:

3.2.3 相关性排序

  • 对查询结果进行打分排序,获取Top N的文档id集合,获取文档原始数据后返回用户。影响打分的因数因素包含:
    • 词频/文档频率(TF/IDF):词频越高打分越高,文档频率越高打分越低
    • boost:lucene支持针对不同字段设置权重,例如当Term出现在标题字段时的打分,通常高于其出现在文档内容中的打分。
    • ……

       至此,我们对Lucene的索引、查询流程有了一个直观的认识。

4. 核心存储

       在3.1.3小节介绍存储索引部分时我们提到,Lucene内存中的数据最终被分为多个文件写入磁盘进行存储。这里我们先整体介绍下Lucene底层的核心存储文件,后续会结合读写流程逐一详细介绍。每个Lucene Index的核心存储文件如下图:

       之前我们提到的词典表、倒排表、字段数据分别存储在上图中的segment1.tim、segment1.doc、segment1.fdt文件中。其他文件存储的数据内容可以参考下表:

文件

后缀

描述

索引信息

segments_n

commit point,存储当前生效的segment集合

写锁

write.lock

避免多个写类IndexWriter同时操作同一个Index

词典表

tim

存储对应segment内包含的term、文档频率,按字典序排序

词典表索引

tip

每n条词典表记录抽取一条建立的稀疏索引,用于加快词典表的查找

倒排表

doc

存储每个term对应的文档id列表及其词频信息

位置数据

pos

存储term在文档中出现的位置、偏移等信息

数字索引

dim

Lucene 6.0引入的、针对数字类型的新索引,通过BKD-tree structure实现,加快范围查询

数字二级索引

dii

加快PointFormat索引查找

字段信息

fnm

存储segment包含的字段名、字段类型、索引属性等信息

字段行存

fdt

以行存方式存储字段数据,通过文档id可以在fdt中获取对应文档的字段数据

字段行存索引

fdx

针对字段行存数据建立的稀疏索引,加快字段数据的定位

字段列存

dvd

Lucene 4.0引入,以列存方式存储字段数据,用于加快排序、聚合等操作

列存元数据

dvm

dvd文件的元数据

段信息

si

记录segment大小、版本、文件列表等元信息

       另外,列举一个Lucene核心存储文件的实际样例,方便参考上面描述对照理解:

5.小结

       本文主要从整体角度介绍Lucene,通过样例程序、基本原理简介等方式建立对Lucene的直观理解。但对Lucene底层存储、主要流程实现等没有详细深入的介绍,后续我们会通过具体文章详细介绍,欢迎大家一起交流讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
    • 1.1 Lucene是什么
      • 1.2 需求
        • 1.3 相关产品
          • 1.4 作者
          • 2. 初步使用
            • 2.1 索引流程
              • 2.2 搜索流程
              • 3. 基本原理
                • 3.1 索引流程
                  • 3.1.1 分词处理
                  • 3.1.2 建立词典表 和 倒排索引
                  • 3.1.3 存储索引
                • 3.2 搜索流程
                  • 3.2.1 词法、语法分析
                  • 3.2.2 搜索索引
                  • 3.2.3 相关性排序
              • 4. 核心存储
              • 5.小结
              相关产品与服务
              Elasticsearch Service
              腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档