Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:
0)设有两篇文章1和2
文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
文章2的内容为:He once lived in Shanghai.
1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
b.文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
e.文章中的标点符号通常不表示某种概念,也可以过滤掉
在lucene中以上措施由Analyzer类完成
经过上面处理后
文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
文章2的所有关键词为:[he] [live] [shanghai]
2) 有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。文章1,2经过倒排后变成
关键词 文章号
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关键词 文章号[出现频率] 出现位置
guangzhou 1[2] 3,6
he 2[1] 1
i 1[1] 4
live 1[2],2[1] 2,5,2
shanghai 2[1] 3
tom 1[1] 1
以live 这行为例我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第 2个关键字。
以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。
实现时 lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,url中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。
为了减小索引文件的大小,Lucene对索引还使用了压缩技术。首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。
下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。
分享到:
相关推荐
### Lucene倒排索引原理详解 #### 一、引言 搜索引擎的速度和效率往往令人惊叹,这其中的秘密在于其背后的索引技术。本篇将通过Lucene这一知名的开源全文检索库,来深入探讨搜索引擎是如何利用倒排索引原理实现高效...
4. **倒排索引(Inverted Index)**:这是Lucene的核心索引结构。每个词项在倒排索引中对应一个倒排列表(Posting List),记录了该词项在哪些文档中出现以及其在文档中的位置。倒排列表通常存储在磁盘上,以节省...
7. **倒排索引**:Lucene的核心是倒排索引,它允许快速定位含有特定术语的文档,极大提高了搜索效率。 ### 四、应用示例 例如,假设你正在构建一个博客平台,可以使用Lucene来实现全文检索功能。每个博客文章作为...
【Lucene 索引结构原理】 Lucene 是一个高性能、全文检索的开源...在Lucene中,这个过程包括分析文本、创建倒排索引等步骤,使得搜索操作从线性时间复杂度转变为对数时间复杂度,显著提高了大规模文本数据的检索速度。
总结来说,Lucene搜索引擎的基本工作原理包括建立倒排索引、处理用户查询以及返回相关性最高的结果。同时,Lucene还支持与目录索引的集成,适应各种搜索场景。通过理解这些原理,开发者可以更好地利用Lucene构建高效...
倒排索引是 Lucene 的核心数据结构,它将每个术语映射到包含该术语的文档列表,以及在这些文档中出现的位置信息。 2. **分词器(Analyzer)**:在 Lucene 3.0 中,分词器负责将输入的文本拆分成可搜索的单元。它...
- **倒排表(Posting List)**:对于每个词项,Lucene会建立一个倒排表,记录包含该词项的所有文档ID及其对应的权重。 - **术语字典(Term Dictionary)**:存储所有词项,便于快速查找对应倒排表。 3. **查询...
接着,通过索引组件Indexer将这些词创建为索引,具体过程包括创建字典、字典排序、合并词项为文档倒排链表等。 Lucene的索引文件格式包括正向信息和反向信息,其中正向信息包含段的元数据、域的元数据、域的数据...
倒排索引是Lucene的核心,它将词语作为索引,每个词语指向一个列表,列表包含了包含该词语的文档ID及其在文档中的位置。这种结构使得搜索时能快速找到包含特定词语的文档。 4. **分析器(Analyzer)**: 分析器...
倒排索引是Lucene的核心数据结构,它将每个Term(词元)映射到包含该Term的所有文档集合,大大提高了搜索效率。 3.2 分词与词频统计 在建立索引时,Analyzer会进行分词,并计算每个词在文档中的频率,这些信息被...
此外,为了优化查询效率,索引通常还包括词汇的排序列表、文档倒排链表等结构。 #### 如何创建索引 1. **原始文档**:收集待索引的文档。 2. **分词组件**:将文档分解成词汇单元(Token),这是索引构建的第一步。...
其次,这些词元被存储在索引中,通常是以倒排表的形式,记录了包含每个词元的文档ID列表。最后,当用户输入查询时,系统会解析查询语句,查找相关的词元在索引中的位置,并计算文档与查询的相关性,以此为基础对结果...
Lucene的核心思想是将文本转换为倒排索引,使得搜索过程高效快速。 二、Lucene索引流程 1. 文档分词:Lucene使用Analyzer对输入的文档进行分词,生成Token流。 2. 字符串到Term:将分词结果转化为Term对象,每个...
4. **倒排索引构建**:为每个词条建立一个指向含有该词条的文档列表的索引项。 5. **索引优化**:通过对索引进行合并等方式提高检索效率。 #### 五、Lucene搜索过程解析 搜索过程涉及到多个环节,包括查询解析、...
- **倒排索引**:将关键词映射到包含该关键词的文档ID列表,形成倒排索引表。例如,"Guangzhou"对应文档1,"live"对应文档1和2,等等。 - **频率和位置信息**:记录关键词在文档中出现的频率和位置,便于精确匹配...
3. **倒排列表**:对于每个词项,Lucene会创建一个倒排列表(Inverted List),其中包含所有包含该词项的文档ID。这些ID通常是按顺序排列的,方便后续的查找操作。 4. **倒排段**:多个倒排列表可以组成一个倒排段...
通过索引组件(Indexer)将得到的词转换成索引数据结构,这通常包括构建字典、排序和创建文档倒排(PostingList)链表等操作。 接着,文档中对Lucene的总体架构进行了介绍。Lucene被设计为一个可以动态添加、删除索引...
倒排索引是一种数据结构,用于快速定位文档中包含特定词条的位置。 5. **索引优化**:通过对索引进行合并、压缩等操作,提高索引的读取速度和存储效率。 #### 五、Lucene 段合并过程分析 Lucene 中的索引是以段...