索引3種方式:倒排、後綴數組和簽名文件.
一段讀寫文本文件的代碼:
BufferWriter writer = new BufferWriter(new FileWriter(destFile));
BufferReader reader = new BufferReader(new FileReader(readFile));
String line = reader.readLine();
while (line != null){
writer.write(newline);
writer.newLine();//寫入行分割符
}
reader.close();
writer.close();
Store類的3個屬性:
Store.NO 不需存儲
Store.YES 需存儲
Store.COMPRESS 壓縮存儲
Index類的4個屬性
Index.NO 不需索引
Index.TOKENIZED 分詞索引
Index.UN_TOKENIZED 不分詞索引
Index.NO_NORMS 索引,但不使用Analyzer,且禁止參加評分
IndexWriter構造方法:
private IndexWriter(Directory d, Analyzer a, final boolean create, boolean closeDir)
public IndexWriter(File path, Analyzer a, boolean create)
throws IOException {
this(FSDirectory.getDirectory(path, create), a, create, true);
}
public IndexWriter(Directory d, Analyzer a, boolean create)
throws IOException {
this(d, a, create, false);
}
往IndexWriter中添加Document
public void addDocument(Document doc) throws IOException {
addDocument(doc, analyzer);
}
public void addDocument(Document doc, Analyzer analyzer) throws IOException {
DocumentWriter dw =
new DocumentWriter(ramDirectory, analyzer, this);
dw.setInfoStream(infoStream);
String segmentName = newSegmentName();
dw.addDocument(segmentName, doc);
synchronized (this) {
segmentInfos.addElement(new SegmentInfo(segmentName, 1, ramDirectory));
maybeMergeSegments();
}
}
注意:在使用addDocument方法後,一定要使用IndexWriter的close方法關閉索引器。否則,索引不會被最終建立,同時可能出現下次加入索引時目錄鎖定的問題。
DocumentWriter的構造方法:
DocumentWriter(Directory directory, Analyzer analyzer,
Similarity similarity, int maxFieldLength) {
this.directory = directory;
this.analyzer = analyzer;
this.similarity = similarity;
this.maxFieldLength = maxFieldLength;
}
DocumentWriter(Directory directory, Analyzer analyzer, IndexWriter writer) {
this.directory = directory;
this.analyzer = analyzer;
this.similarity = writer.getSimilarity();
this.maxFieldLength = writer.getMaxFieldLength();
this.termIndexInterval = writer.getTermIndexInterval();
}
DocumentWriter的addDocument方法:
final void addDocument(String segment, Document doc)
throws IOException {
// write field names
fieldInfos = new FieldInfos();
fieldInfos.add(doc);
fieldInfos.write(directory, segment + ".fnm");
// write field values負責寫入.fdx和.fdt文件
FieldsWriter fieldsWriter =
new FieldsWriter(directory, segment, fieldInfos);
try {
fieldsWriter.addDocument(doc);
} finally {
fieldsWriter.close();
}
// invert doc into postingTable
postingTable.clear(); // clear postingTable初始化存儲所有詞條的HashTable
fieldLengths = new int[fieldInfos.size()]; // init fieldLengths
fieldPositions = new int[fieldInfos.size()]; // init fieldPositions所有Field在分析完畢後的最終Position
fieldOffsets = new int[fieldInfos.size()]; // init fieldOffsets
fieldBoosts = new float[fieldInfos.size()]; // init fieldBoosts
Arrays.fill(fieldBoosts, doc.getBoost());
invertDocument(doc);//倒排Document中每Field
// sort postingTable into an array對詞條進行排序
Posting[] postings = sortPostingTable();
// write postings把詞條信息寫入索引,主要是向.frq和.prx文件中寫入詞條的頻率和位置信息
writePostings(postings, segment);
// write norms of indexed fields把得分信息寫入索引,主要是向.f文件中寫入
writeNorms(segment);
}
索引目錄內的文件:
segment,是一個邏輯概念,在每個segment時,有許多的Document。每個segment內的所有索引文件都具有相同的前綴,但後綴不同。每個segment的名稱都是由segmentInfos.counter先加1,再轉成36進制,再在前面加上_而成。segmentInfos.counter的值其實就是當前segemnt中總共的文檔數量。
而一個目錄下隻有一個segments和deleable文件
分享到:
相关推荐
Lucene入门与使用,非常简单,适合入门
`lucene入门小实例.txt` 文件中可能包含了一个简单的Lucene使用示例,例如: 1. 创建 `Directory` 对象,比如使用 `FSDirectory.open()` 打开一个文件系统的目录来存储索引。 2. 实例化 `Analyzer`,如使用 `...
这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...
以上是Lucene入门的基本知识和关键概念,通过深入学习和实践,你可以掌握如何利用Lucene构建强大的全文搜索引擎。记住,实践中遇到的问题往往是最好的学习资源,不断尝试和解决,你将逐渐成为Lucene的专家。
**Lucene 3.6 入门案例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询、评分等,广泛应用于各种项目和产品中。在这个入门案例中,我们将深入理解如何...
**Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高性能、可扩展的信息检索服务。Lucene最初由Doug Cutting开发,现在已经成为Java社区中事实上的标准...
【Lucene】Lucene入门心得 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单的API,使得开发者可以方便地在自己的应用程序中集成全文检索功能。...
**全文搜索引擎Lucene入门** 全文搜索引擎Lucene是Apache软件基金会的一个开放源代码项目,它为Java开发者提供了一个高性能、可扩展的信息检索库。Lucene以其强大的文本搜索功能和高效的索引能力,在各种需要全文...
这个“Lucene入门demo”将帮助我们理解如何使用 Lucene 进行基本的索引和搜索操作。 **一、Lucene 的核心概念** 1. **索引(Indexing)**: 在 Lucene 中,索引是文档内容的预处理结果,类似于数据库中的索引。通过...
lucene入门相关知识,包括基本介绍、简单示例、核心API介绍。
**Lucene 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是 Java 开发人员用来构建搜索引擎应用程序的基础工具。本指南将帮助初学者理解 Lucene 的核心概念,以及如何利用它来...
在这个经典Lucene入门模块中,我们将深入理解如何使用Lucene进行索引创建和搜索操作。 首先,我们来看Lucene如何建立数据的索引。这通常涉及以下几个步骤: 1. **索引创建**:使用 `IndexWriter` 对象来创建或更新...
【Lucene 概述】 Lucene 是一个开源的全文搜索引擎框架,主要负责处理文本数据的检索和搜索。作为一款开发工具,它不直接提供类似百度或Google Desktop的现成产品,而是为开发者提供了构建自定义搜索应用的基础。...
**标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...
NULL 博文链接:https://kylinsoong.iteye.com/blog/719415
通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene.Net项目,创建和管理索引,编写查询,优化搜索性能,并掌握如何处理搜索结果。教程可能涵盖从安装步骤、基本概念介绍,到实战...