- 浏览: 82587 次
- 性别:
- 来自: 江西
最新评论
-
115646002:
我请问个问题:
我在配置eclipse3.6的时候,应该是某一 ...
eclipse 3.6 Helios 最新插件 -
xangqun:
是啊,不过真的很好用
tomcat插件与Jrebel插件整合(java web开发利器) -
freecode:
jrebel收费吧
tomcat插件与Jrebel插件整合(java web开发利器) -
lydawen:
开发js相当不错的插件 aptana - http://upd ...
eclipse3.5 Galileo最新实用插件 -
hszhl:
eclipse{wtp+cdt+ve#/windowBuild ...
eclipse3.5 Galileo最新实用插件
5、DocumentsWriter对CharBlockPool,ByteBlockPool,IntBlockPool的缓存管理
- 在索引的过程中,DocumentsWriter将词信息(term)存储在CharBlockPool中,将文档号(doc ID),词频(freq)和位置(prox)信息存储在ByteBlockPool中。
- 在ByteBlockPool中,缓存是分块(slice)分配的,块(slice)是分层次的,层次越高,此层的块越大,每一层的块大小事相同的。
- nextLevelArray表示的是当前层的下一层是第几层,可见第9层的下一层还是第9层,也就是说最高有9层。
- levelSizeArray表示每一层的块大小,第一层是5个byte,第二层是14个byte以此类推。
ByteBlockPool类中有以下静态变量: final static int[] nextLevelArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 9}; |
- 在ByteBlockPool中分配一个块的代码如下:
//此函数仅仅在upto已经是当前块的结尾的时候方才调用来分配新块。 public int allocSlice(final byte[] slice, final int upto) { //可根据块的结束符来得到块所在的层次。从而我们可以推断,每个层次的块都有不同的结束符,第1层为16,第2层位17,第3层18,依次类推。 final int level = slice[upto] & 15; //从数组总得到下一个层次及下一层块的大小。 final int newLevel = nextLevelArray[level]; final int newSize = levelSizeArray[newLevel]; // 如果当前缓存总量不够大,则从DocumentsWriter的freeByteBlocks中分配。 if (byteUpto > DocumentsWriter.BYTE_BLOCK_SIZE-newSize) nextBuffer(); final int newUpto = byteUpto; final int offset = newUpto + byteOffset; byteUpto += newSize; //当分配了新的块的时候,需要有一个指针从本块指向下一个块,使得读取此信息的时候,能够在此块读取结束后,到下一个块继续读取。 //这个指针需要4个byte,在本块中,除了结束符所占用的一个byte之外,之前的三个byte的数据都应该移到新的块中,从而四个byte连起来形成一个指针。 buffer[newUpto] = slice[upto-3]; buffer[newUpto+1] = slice[upto-2]; buffer[newUpto+2] = slice[upto-1]; // 将偏移量(也即指针)写入到连同结束符在内的四个byte slice[upto-3] = (byte) (offset >>> 24); slice[upto-2] = (byte) (offset >>> 16); slice[upto-1] = (byte) (offset >>> 8); slice[upto] = (byte) offset; // 在新的块的结尾写入新的结束符,结束符和层次的关系就是(endbyte = 16 | level) buffer[byteUpto-1] = (byte) (16|newLevel); return newUpto+3; } |
- 在ByteBlockPool中,文档号和词频(freq)信息是应用或然跟随原则写到一个块中去的,而位置信息(prox)是写入到另一个块中去的,对于同一个词,这两块的偏移量保存在IntBlockPool中。因而在IntBlockPool中,每一个词都有两个int,第0个表示docid + freq在ByteBlockPool中的偏移量,第1个表示prox在ByteBlockPool中的偏移量。
- 在写入docid + freq信息的时候,调用termsHashPerField.writeVInt(0, p.lastDocCode),第一个参数表示向此词的第0个偏移量写入;在写入prox信息的时候,调用termsHashPerField.writeVInt(1, (proxCode<<1)|1),第一个参数表示向此词的第1个偏移量写入。
- CharBlockPool是按照出现的先后顺序保存词(term)
- 在TermsHashPerField中,有一个成员变量RawPostingList[] postingsHash,为每一个term分配了一个RawPostingList,将上述三个缓存关联起来。
abstract class RawPostingList { final static int BYTES_SIZE = DocumentsWriter.OBJECT_HEADER_BYTES + 3*DocumentsWriter.INT_NUM_BYTE; int textStart; //此词在CharBlockPool中的偏移量,由此可以知道是哪个词。 int intStart; //此词在IntBlockPool中的偏移量,在指向的位置有两个int,一个是docid + freq信息的偏移量,一个是prox信息的偏移量。 int byteStart; //此词在ByteBlockPool中的起始偏移量 } static final class PostingList extends RawPostingList { int docFreq; // 此词在此文档中出现的次数 int lastDocID; // 上次处理完的包含此词的文档号。 int lastDocCode; // 文档号和词频按照或然跟随原则形成的编码 int lastPosition; // 上次处理完的此词的位置 } 这里需要说明的是,在IntBlockPool中保存了两个在ByteBlockPool中的偏移量,而在RawPostingList的byteStart又保存了在ByteBlockPool中的偏移量,这两者有什么区别呢? 在IntBlockPool中保存的分别指向docid+freq及prox信息在ByteBlockPool中的偏移量是主要用来写入信息的,它记录的偏移量是下一个要写入的docid+freq或者prox在ByteBlockPool中的位置,随着信息的不断写入,IntBlockPool中的两个偏移量是不断改变的,始终指向下一个可以写入的位置。 RawPostingList中byteStart主要是用来读取docid及prox信息的,当索引过程基本结束,所有的信息都写入在缓存中了,那么如何找到此词对应的文档号偏移量及位置信息,然后写到索引文件中去呢?自然是通过RawPostingList找到byteStart,然后根据byteStart在ByteBlockPool中找到docid+freq及prox信息的起始位置,从起始位置开始的两个大小为5的块,第一个就是docid+freq信息的源头,第二个就是prox信息的源头,如果源头的块中包含了所有的信息,读出来就可以了,如果源头的块中有指针,则沿着指针寻找到下一个块,从而可以找到所有的信息。 |
- 下面举一个实例来表明如果进行缓存管理的:
此例子中,准备添加三个文件: file01: common common common common common term file02: common common common common common term term file03: term term term common common common common common file04: term (1) 添加第一篇文档第一个common
(2) 添加第四个common
(3) 添加第五个common
(4) 添加第一篇文档,第一个term
(5) 添加第二篇文档第一个common
(6) 添加第二篇文档第一个term
(7) 添加第三篇文档的第一个term
(8) 添加第三篇文档第二个term
(9) 添加第三篇文档第四个common
(10) 添加第三篇文档的第五个common
(11) 添加第四篇文档的第一个term
(12) 最终PostingList, CharBlockPool, IntBlockPool,ByteBlockPool的关系如下图:
|
转:http://forfuture1978.iteye.com/blog/587120
发表评论
-
Lucene学习总结之十:Lucene的分词器Analyzer(转)
2010-06-08 11:31 14121、抽象类Analyzer 其主要包含两个接口,用于生成To ... -
Lucene学习总结之九:Lucene的查询对象(3)转
2010-06-08 11:30 9456、FilteredQuery FilteredQue ... -
Lucene学习总结之九:Lucene的查询对象(2)转
2010-06-08 11:29 9395、SpanQuery 所谓SpanQuery也即在查询过 ... -
Lucene学习总结之九:Lucene的查询对象(1)转
2010-06-08 11:27 1053Lucene除了支持查询语法以外,还可以自己构造查询 ... -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(2)转
2010-06-08 11:25 965三、解析QueryParser.jj 3.1、声明Qu ... -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)转
2010-06-08 11:24 1115一、Lucene的查询语法 Lucene所支持的查询语法可见 ... -
Lucene学习总结之七:Lucene搜索过程解析(8)转
2010-06-08 11:22 9612.4、搜索查询对象 2.4.4、收集文档结 ... -
Lucene学习总结之七:Lucene搜索过程解析(7)转
2010-06-08 11:20 10652.4、搜索查询对象 2.4.3.2、并集Di ... -
Lucene学习总结之七:Lucene搜索过程解析(6)转
2010-06-08 11:20 15452.4、搜索查询对象 2.4.3、进行倒排表合并 ... -
Lucene学习总结之七:Lucene搜索过程解析(5)转
2010-06-08 11:19 10662.4、搜索查询对象 2.4.2、创建Sco ... -
Lucene学习总结之七:Lucene搜索过程解析(4)转
2010-06-08 11:18 8802.4、搜索查询对象 2.4.1.2、创建Weig ... -
Lucene学习总结之七:Lucene搜索过程解析(3)转
2010-06-08 11:17 10942.3、QueryParser解析查询语句生成查询对象 ... -
Lucene学习总结之七:Lucene搜索过程解析(2)转
2010-06-08 11:16 913二、Lucene搜索详细过程 为了解析Lucene对索引文件 ... -
Lucene学习总结之七:Lucene搜索过程解析(1)转
2010-06-08 11:15 919一、Lucene搜索过程总论 搜索的过程总的来说就是将词典及 ... -
Lucene学习总结之六:Lucene打分公式的数学推导(转)
2010-06-08 11:13 963在进行Lucene的搜索过程 ... -
Lucene学习总结之五:Lucene段合并(merge)过程分析(转)
2010-06-08 11:12 1104一、段合并过程总论 IndexWriter中与段合并有关的成 ... -
Lucene学习总结之四:Lucene索引过程分析(4)转
2010-06-08 11:08 8166、关闭IndexWriter对象 代码: writ ... -
Lucene学习总结之四:Lucene索引过程分析(2)转
2010-06-08 11:06 8633、将文档加入IndexWriter 代码: write ... -
Lucene学习总结之四:Lucene索引过程分析(1)转
2010-06-08 11:05 860对于Lucene的索引过程,除了将词(Term)写入倒排表并最 ... -
Lucene学习总结之三:Lucene的索引文件格式 (3)转
2010-06-08 11:02 911四、具体格式 4.2. 反向信息 反向信息是索引文件的 ...
相关推荐
Lucene学习总结之一:全文检索的基本原理 Lucene学习总结之二:Lucene的总体架构 ...Lucene学习总结之四:Lucene索引过程分析(3) Lucene学习总结之四:Lucene索引过程分析(4) www.chinaandroid.com
索引创建(Indexing)阶段,Lucene会分析文档内容,将文本分解成一个个单独的词语(称为术语或Token),然后建立反向索引。反向索引的核心是一个词典,其中每个词汇都有一个列表,列出了包含该词汇的所有文档编号。...
#### 四、Lucene索引过程分析 Lucene的索引过程是一个复杂而有序的操作流程,主要步骤如下: - **1. 创建IndexWriter对象**:初始化索引写入器。 - **2. 创建文档Document对象,并加入域(Field)**:定义文档结构和...
总结起来,Lucene5学习之增量索引(Zoie)涉及到的关键技术点包括: 1. 基于Lucene的增量索引解决方案:Zoie系统。 2. 主从复制架构:Index Provider和Index User的角色。 3. 数据变更追踪:通过变更日志实现增量索引...
**Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...
以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...
Lucene通过分析这些文本,将其拆分为术语,并在倒排索引中存储每个术语的位置信息,以便快速定位到包含特定术语的文档。 **2. 增量索引的概念** 增量索引的目的是避免重新构建整个索引,尤其是在大型数据集上,这...
本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、Lucene3.0简介 Lucene是一款高性能、全功能的全文搜索引擎库。它为开发者提供了构建搜索应用所需的所有基本工具...
#### 四、Lucene3建立索引的步骤 1. **创建Directory对象**:指定索引文件的存储位置。 2. **创建IndexWriter对象**:初始化索引写入器,设置分析器、是否创建新索引等参数。 3. **获取源文件**:加载需要索引的...
同时,`HelloLucene_delete`这个压缩包文件可能是某个示例项目,通过分析其中的代码,你可以更直观地了解Lucene删除索引的实现方式。 总之,Lucene的删除索引机制是一个复杂但高效的过程,涉及到了位向量、段管理和...
3. 索引(Index):Lucene通过构建索引来加速搜索。索引过程涉及分词(Tokenization)、词干提取(Stemming)、同义词扩展(Synonym Expansion)等步骤,将文本转换为可搜索的结构。 4. 分词器(Analyzer):负责将...
以下是对Lucene索引机制的详细解析: 一、Lucene的索引过程 1. 文档分析:当向Lucene添加文档时,首先会经过一个分词器(Tokenizer),将文本拆分成一系列的词项(Token)。接着,这些词项会被过滤(Filter)和...
这就是"Lucene 索引 查看 工具"的用途,它可以帮助我们分析和理解 Lucene 索引的工作原理。 主要知识点: 1. **Lucene 索引**:Lucene 的索引是一种倒排索引,它将文档中的词项(tokens)映射到包含这些词项的文档...
通过阅读和分析源代码,我们可以学习到如何操作Lucene索引,以及如何构建类似的工具。 总结而言,luke作为Lucene索引的可视化工具,极大地便利了开发者对索引的理解和调试。无论是初学者还是经验丰富的开发人员,都...
本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...
在使用 Lucene 进行信息检索时,有时我们需要对建立的索引进行查看、调试或分析,这时就需要借助 Lucene 的索引查看工具。 Luke 是一个非常实用的 Lucene 索引浏览器,全称为 Lucidworks Luke。它允许用户以图形化...
【基于 Lucene 索引的分析与实现】 在当今信息爆炸的时代,互联网上的数据量呈指数级增长,人们对于高效检索信息的需求日益强烈。Lucene,作为一个强大的Java全文检索库,提供了便捷的索引和搜索功能,为解决海量...
**Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文...本项目提供了一个基础的实现示例,对于初学者来说,是学习Lucene索引和查询的绝佳起点。在实际应用中,可以进一步扩展和优化,以满足更复杂的需求。
**Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...