一、索引是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是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...
**luke-7.1.0:Lucene索引查看工具详解** Luke是Apache Lucene项目的一个重要辅助工具,主要用于查看、分析和测试Lucene创建的索引。这个7.1.0版本提供了对Lucene索引的强大洞察力,帮助开发者、搜索引擎优化者以及...
**Lucene索引分析工具详解** Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索功能的基础。在这个场景中,我们关注的是一个专门针对Lucene.net的索引分析工具,该工具被称为"Lucene...
《Lucene索引文件格式详解》 Lucene,作为一款强大的全文搜索引擎库,其索引文件格式是实现高效搜索的关键。本文将深入解析Lucene 1.3版本的索引文件结构,帮助读者理解其内部运作机制。 首先,我们要理解Lucene...
### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...
**Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...
1. **索引**:在Lucene中,数据不是直接存储的,而是被转换为一种叫做索引的数据结构。索引是经过分析和分词后的文档内容,使得搜索过程可以快速定位到相关的文档。 2. **文档**:在Lucene中,一个文档可以包含多个...
《Lucene搜索过程深度解析》 Lucene,作为一款强大的全文搜索引擎库,其搜索机制是其核心功能之一。本文将详细剖析Lucene的搜索实现过程,通过代码解析,帮助读者深入理解其工作原理。 首先,搜索过程始于打开并...
《Lucene索引详解》 在信息技术领域,搜索引擎扮演着至关重要的角色,而Lucene作为开源的全文检索库,是构建高效、可扩展搜索功能的首选工具。本文将深入探讨Lucene索引的工作原理和核心概念,特别是针对中文词汇...
Lucene提供了合并段(Merge)和优化索引(Optimize)的功能,以减少索引碎片,提高搜索性能。同时,定期删除已删除的文档和重建索引也是维护工作的一部分。 通过学习和实践这些基本功能,开发者可以构建出高效、...
二、Lucene索引创建流程 1. 初始化:首先,我们需要导入Lucene库,并创建一个标准的Analyzer,例如StandardAnalyzer,它对输入的文本进行标准化处理。 2. 创建索引目录:索引数据会存储在一个Directory对象中,...
它的核心功能之一是根据用户查询与文档的相关性进行打分,这个过程涉及到一个关键的概念——评分公式。本文将深入探讨Lucene的评分公式,理解其工作原理,并探讨如何通过自定义评分公式来影响搜索结果的排序。 首先...
**标题:“Lucene索引管理器(基于Luke修改而来)”** **内容详解:** Lucene是一个高性能、全文本搜索引擎库,由Apache软件基金会开发。它提供了核心的索引和搜索功能,是开源Java库,被广泛应用于各种搜索引擎的...
1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。这个过程包括分析(Analyzer)文本、分词、创建倒排索引等步骤。倒排索引允许我们快速定位包含特定词汇的文档。 2. **...
《Lucene 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...
- **索引**: Lucene首先对文档内容建立索引,这个过程类似于书籍的目录,使得搜索能快速定位到目标文档。索引由倒排索引(Inverted Index)构成,将每个词与包含这个词的文档对应起来。 - **文档**: 在Lucene中,...
**Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...