`
deepfuture
  • 浏览: 4401387 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80081
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70084
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103394
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285861
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15015
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67597
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32164
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45998
社区版块
存档分类
最新评论

lucene索引过程详解

阅读更多

一、索引是LUCENE最重要的一个过程,通过IndexWriter的addDocument接口,可以将构建的Document加入索引。

二、IndexWriter的addDocument方法首先创建一个DocumentWriter对象,接着为Segment命名,然后调用DocumentWriter的addDocument()方法向索引中增加文档,最后将Segment的信息保存,如果有多个segment则判断是否需要合并,如果需要则合并。一个索引可能有多个segment,每个segment里有许多Document。每个segment的前缀生成方式是将segmentInfos.couter值(当前segment中总共的文档数量)先加1,再转移成36进制,然后在前面加一个下划线就成为了segment的名称。

三、DocumentWriter的addDocument方法完成实际的数据存储工作。

1)第一步,首先初始化一个FieldInfos对象,然后将当前Document传入其中,把所有Field的信息(注意不是内容)写入.fnm文件(在FieldInfos.write完成)。

(A)在写入工作之前使用FieldInfos.add方法将当前的Document加入到fieldInfos对象中。

(B)FieldInfos.write实现:

public void write(Diretory d,String name) throws IOException{

IndexOutput output=d.createOutput(name);

try{

//写入fields信息

write(output);

}finally{

//关闭输出流

output.close();

}

}

public void write(IndexOutput output) throws IOException{

//先写入Fields的数量

output.writerVInt(size());

//对所有Fields进行循环

for (int i=0;i<size();i++) {

FieldInfo fi=fieldInfo(i);

byte bits=Ox0;

if (fi.isIndexed) bits|=IS_INDEXED;

if (fi.storeTermVector) bits|=STORE_TERMVECTOR;

if (fi.storePositionWithTermVector) bits|=STORE_POSITIONS_WITH_TERMVECTOR;

if (fi.storeOffsetWithTermVector) bits|=STORE_OFFSET_WITH_TERMVECTOR;

if (fi.omitNorms) bits|=OMIT_NORMS;

output.writeString(fi.name);

output.writeByte(bits);

}

}

2)第二步,使用fieldWriter.addDocument方法将Document中的各个Field信息写入.fdt文件和.fdx文件。

(A)首先,向.fdx写入当前Document的位置信息

(B)接着,将需要存储的field的数量写入.fdt中

(C)遍历field。

a)如果当前field需要存储,向.fdt中写入field的编号

b)使用位运算来表示当前field的各种属性。向.fdt中写入当前field属性

c)如果field需要压缩,则进行压缩,将压缩后的field数据长度写入.fdt,之后,向.fdt中写入field的值。

d)如果不需要压缩,如果field是二进制类型,则将field数据长度写入.fdt,之后,向.fdt中写入field的值;如果不是二进制类型,直接向.fdt写入field的值

3)第三步,初始化hashtable和其它一些长度数据。

4)调用invertDocument进行文件倒排,有2个主要部分

A)对所有需要加入索引的field进行遍历。对于那些不需要分词的field,就将其整个field的数据做为一个大词条,放入postingTable(一个hashtable)中去(使用adddPostion方法加入名称、值、频率、位置,如果要求还要加上词条向量)。

B)对于需要分词的field,则调用底层分词接口进行分词,然后将每个分出来的词都放入到postingTable中去。

5)第四步,将postingtable进行转化成posting数组进行排序。使所有词条按字典顺序排列

6)第五步,将排列好的词条信息写入.tii和.tis文件,将频率和位置信息.frq和.prx文件

A)lucene索引中对词条的保存并非完整的词条本身,如"smi smith steve" 保存为"smi" "th" "teve"词条片段。

四、索引文件格式

1)segment

每个segment代表lucene的一个完整索引段。在一个索引中,会包含多个segment。每个segment都有统一的前缀,这个前缀是根据当前索引的Document的数量而确立的。一个完整的索引,只有一个segments文件,记录当前索引中所有segment的信息。

2).fnm

.fnm格式的文件中包含了Document中的所有field名称。

3).fdx和.fdt格式

.fdt用于存储具有Store.YES属性的Field的数据。而.fdx类型文件则是一个索引,用于存储Document在.fdt中的位置。

4).tii和.tis格式

.tii用于存储分词后的词条,而.tii是它的索引文件,标明了每个.tis文件中的词条的位置。

五、复合索引格式.cfs

在IndexWriter中有一个属性:useCompoundFile,默认值为True,在初始化完一个IndexWriter对象后,使用setUseCompoundFile(boolean)方法将useCompoundFile的属性值设为True

分享到:
评论

相关推荐

    Lucene索引器实例

    **Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...

    luke-7.1.0 lucene索引查看工具

    **luke-7.1.0:Lucene索引查看工具详解** Luke是Apache Lucene项目的一个重要辅助工具,主要用于查看、分析和测试Lucene创建的索引。这个7.1.0版本提供了对Lucene索引的强大洞察力,帮助开发者、搜索引擎优化者以及...

    Lucene索引分析工具

    **Lucene索引分析工具详解** Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索功能的基础。在这个场景中,我们关注的是一个专门针对Lucene.net的索引分析工具,该工具被称为"Lucene...

    Lucene索引文件格式

    《Lucene索引文件格式详解》 Lucene,作为一款强大的全文搜索引擎库,其索引文件格式是实现高效搜索的关键。本文将深入解析Lucene 1.3版本的索引文件结构,帮助读者理解其内部运作机制。 首先,我们要理解Lucene...

    Lucene开发详解.pdf

    ### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...

    lucene文档笔记详解

    **Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...

    Lucene 概述视频详解

    1. **索引**:在Lucene中,数据不是直接存储的,而是被转换为一种叫做索引的数据结构。索引是经过分析和分词后的文档内容,使得搜索过程可以快速定位到相关的文档。 2. **文档**:在Lucene中,一个文档可以包含多个...

    lucene搜索过程代码详解

    《Lucene搜索过程深度解析》 Lucene,作为一款强大的全文搜索引擎库,其搜索机制是其核心功能之一。本文将详细剖析Lucene的搜索实现过程,通过代码解析,帮助读者深入理解其工作原理。 首先,搜索过程始于打开并...

    lucene索引

    《Lucene索引详解》 在信息技术领域,搜索引擎扮演着至关重要的角色,而Lucene作为开源的全文检索库,是构建高效、可扩展搜索功能的首选工具。本文将深入探讨Lucene索引的工作原理和核心概念,特别是针对中文词汇...

    Lucene 常用功能介绍视频详解

    Lucene提供了合并段(Merge)和优化索引(Optimize)的功能,以减少索引碎片,提高搜索性能。同时,定期删除已删除的文档和重建索引也是维护工作的一部分。 通过学习和实践这些基本功能,开发者可以构建出高效、...

    lucene全文检索简单索引和搜索实例

    二、Lucene索引创建流程 1. 初始化:首先,我们需要导入Lucene库,并创建一个标准的Analyzer,例如StandardAnalyzer,它对输入的文本进行标准化处理。 2. 创建索引目录:索引数据会存储在一个Directory对象中,...

    lucene评分公式详解

    它的核心功能之一是根据用户查询与文档的相关性进行打分,这个过程涉及到一个关键的概念——评分公式。本文将深入探讨Lucene的评分公式,理解其工作原理,并探讨如何通过自定义评分公式来影响搜索结果的排序。 首先...

    Lucene索引管理器(基于Luke修改而来)

    **标题:“Lucene索引管理器(基于Luke修改而来)”** **内容详解:** Lucene是一个高性能、全文本搜索引擎库,由Apache软件基金会开发。它提供了核心的索引和搜索功能,是开源Java库,被广泛应用于各种搜索引擎的...

    Lucene 实时搜索视频详解

    1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。这个过程包括分析(Analyzer)文本、分词、创建倒排索引等步骤。倒排索引允许我们快速定位包含特定词汇的文档。 2. **...

    lucene5+zoie实现近实时索引

    《Lucene 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...

    全文检索(Lucene)详解

    - **索引**: Lucene首先对文档内容建立索引,这个过程类似于书籍的目录,使得搜索能快速定位到目标文档。索引由倒排索引(Inverted Index)构成,将每个词与包含这个词的文档对应起来。 - **文档**: 在Lucene中,...

    Lucene分词与查询详解

    **Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...

Global site tag (gtag.js) - Google Analytics