1. 索引过程
1.1 提取文本和创建文档
首先从文件中提取文本格式信息,并用这些文本信息创建Lucene文档和域。
1.2 分析文档
创建Lucene文档和域后,就可以调用IndexWriter对象的addDocument方法将数据传递给Lucene进行索引操作了。在索引操作时,Lucene首先分析文本,将文本数据分割成语汇单元串,然后对它们执行一些可选操作。如:LowerCaseFilter类实现搜索不对大小写敏感、StopFilter类从输入中去掉一些使用频繁却没有意义的词、PorterStemFilter类处理英文文本去掉它们的词干。这些将原始数据转换为词汇单元,随便用一系列Filter来修正该语汇单元的操作。
1.3 向索引添加文档
对输入数据分析完毕后,就可以将分析结果写入索引文件中。Lucene将输入数据以一种倒排索引的数据结构进行存储。Lucene使用倒排数据结构的原因是:把文档中提取出的语汇单元作为查询关键字,而不是将文档作为中心实体。换句话说,倒排索引不是回答“这个文档中包含哪些单词?”,而是经过优化后用来快速回答“哪些文档包含单词X?”这个问题。
Lucene的索引文件目录有唯一一个段结构-索引段:
Lucene索引都包含一个或多个段,每个段都是一个独立的索引,它包含事个文档索引的一个子集。每当Writer刷新缓冲区增加文档,以及挂起目录删除操作时,索引文件都会建立一个新段。在搜索索引时,每个段都是单独访问的,但搜索结果是合并返回的。
每个段都包含多个文件,文件格式为_X.<ext>,这里X代表段名称,<ext>代表扩展名,用来标识该文件对应索引的某个部分。如果使用混合文件格式(Lucene默认处理方式,可通过IndexWriter.setUseCompoundFile方法进行修改),则上述索引文件都会被压缩成一个单一的文件:_X.cfs。这种方式在搜索期间减少打开的文件数量。
还有一个特殊文件,叫段文件,用段_<N>标识,该文件指向所有激活的段。Lucene会首先打开该文件,然后打开它指向的其他文件。值<N>被称为“the geneeration”,它是一个整数,Lucene每次向索引提交更改时都会将这个数加1。
IndexWriter会周期性地选择一些段,然后将它们合并到一个新段中,然后删除老的段。被合并段的选取策略由一个独立的MergePolicy类主导。一旦选好这些段,具体合并操作由MergeScheduler类实现。
2. 基本索引操作
package lucene.indexing; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class IndexingTest { private String[] ids = { "1", "2" }; private String[] unindexed = { "netherlands", "italy" }; private String[] unstored = { "amsterdam has lots of bridges", "venice has lots of canals" }; private String[] text = { "amsterdam", "venice" }; private Directory directory; public IndexingTest() throws IOException { directory = FSDirectory.open(new File("F:/project/Lucene/index")); } private IndexWriter getWriter() throws IOException { Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_40); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer); return new IndexWriter(directory, config); } private void getHitCount(String searchString, String fieldName) throws IOException { IndexReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); Term term = new Term(searchString, fieldName); Query query = new TermQuery(term); TopDocs hits = searcher.search(query, null, 10000); System.out.print("在" + searchString + "中查询" + fieldName + ":"); for (ScoreDoc scoreDoc : hits.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); System.out.print(doc.get("id")); System.out.print(","); System.out.print(doc.get("country")); System.out.print(","); System.out.print(doc.get("contents")); System.out.print(","); System.out.print(doc.get("city")); System.out.println("."); } System.out.println(); } public void testIndexWriter() throws IOException { IndexWriter writer = getWriter(); writer.numDocs(); System.out.println("writer.numDocs=" + writer.numDocs()); writer.close(); } public void testIndexReader() throws IOException { IndexReader reader = DirectoryReader.open(directory); System.out.println("reader.maxDoc=" + reader.maxDoc()); System.out.println("reader.numDocs=" + reader.numDocs()); reader.close(); } public void testUpdate() throws IOException { getHitCount("city", "amsterdam"); getHitCount("city", "den haag"); getHitCount("contents", "amsterdam"); getHitCount("contents", "den"); IndexWriter writer = getWriter(); Document doc = new Document(); doc.add(new StringField("id", "1", Store.YES)); doc.add(new StringField("country", "nnetherlands", Store.YES)); doc.add(new TextField("contents", "den haag has a lot of museums", Store.YES)); doc.add(new StringField("city", "den haag", Store.YES)); writer.updateDocument(new Term("id", "1"), doc); writer.close(); getHitCount("city", "amsterdam"); getHitCount("city", "den haag"); getHitCount("contents", "amsterdam"); getHitCount("contents", "den"); } public void testDelete() throws IOException{ getHitCount("city", "amsterdam"); getHitCount("city", "venice"); getHitCount("contents", "amsterdam"); getHitCount("contents", "venice"); IndexWriter writer=getWriter(); writer.deleteDocuments(new Term("id","1")); writer.commit(); writer.close(); getHitCount("city", "amsterdam"); getHitCount("city", "venice"); getHitCount("contents", "amsterdam"); getHitCount("contents", "venice"); } public void set() throws IOException { // directory = new RAMDirectory(); IndexWriter writer = getWriter(); for (int i = 0; i < ids.length; i++) { Document doc = new Document(); doc.add(new StringField("id", ids[i], Store.YES)); doc.add(new StringField("country", unindexed[i], Store.YES)); doc.add(new TextField("contents", unstored[i], Store.NO)); doc.add(new StringField("city", text[i], Store.YES)); writer.addDocument(doc); } writer.close(); } public static void main(String[] args) throws IOException { IndexingTest test = new IndexingTest(); test.set(); test.testIndexWriter(); test.testIndexReader(); test.testUpdate(); //test.testDelete(); } }
相关推荐
在创建索引时,Lucene会对文档进行分词,生成一系列的关键词(也称为术语或Token),然后构建倒排索引。倒排索引是一种数据结构,它将每个关键词与包含该关键词的文档位置相关联,使得我们可以迅速找到包含特定词汇...
lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....
这些示例代码可以帮助开发者理解如何使用Lucene构建索引,以及如何执行搜索操作。 总结来说,Lucene的索引机制是其高效搜索能力的关键。通过建立倒排索引,Lucene能够在大量数据中快速找到匹配的文档,使得全文检索...
通过上述步骤,我们可以构建一个基于Lucene的增量索引系统,高效地处理数据变化,同时保持搜索效率。在实际应用中,还需要结合具体的业务需求和数据特性进行定制化开发。通过持续监控和优化,我们可以确保系统的稳定...
《深入理解Lucene:解析索引文件的读取》 Lucene,作为一款强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。它的核心功能之一就是构建和读取索引文件,以高效地进行文本搜索。本文将深入探讨Lucene如何读取...
本文档主要探讨了基于Apache Lucene的索引与搜索技术,这是构建高效全文搜索引擎的关键组成部分。Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言...
Lucene 是一个高性能、全文本搜索库,被广泛用于构建高效的搜索引擎和信息检索系统。它提供了完整的搜索功能,包括分析、索引、查询以及结果排序等。在Java开发中,Lucene 提供了丰富的API来简化这些操作。以下是...
然而,在面对海量数据时,Lucene的索引构建过程可能会变得非常耗时,从而影响用户体验。因此,开发一种基于Lucene的分布式并行索引技术显得尤为重要。 #### 二、Lucene基础概述 Lucene是一个高性能、全功能的文本...
- Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索功能。 - Lucene的核心能力在于文档索引和查询,它提供了强大的API来实现高效的文档检索。 2. **XML简介** - XML(Extensible Markup ...
在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...
Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容。luke 7.2.0 支持最新的 lucene7 索引查看 github地址:https://github.com/DmitryKey/luke/releases
通过阅读和分析源代码,我们可以学习到如何操作Lucene索引,以及如何构建类似的工具。 总结而言,luke作为Lucene索引的可视化工具,极大地便利了开发者对索引的理解和调试。无论是初学者还是经验丰富的开发人员,都...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
它为开发者提供了构建搜索应用所需的所有基本工具,包括索引文档、执行查询、处理分析等。Lucene3.0是该系列的一个版本,在性能和稳定性方面都有所提升。 #### 二、创建索引的基本步骤 根据提供的描述,创建索引的...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文检索功能。在深入理解Lucene...
Lucene索引的构建和查询都是基于反向索引进行的,这意味着当用户输入查询词时,Lucene能够迅速找到包含这些词的所有文档,而不必遍历整个文档集。 #### 索引文件格式 Lucene索引文件格式是其内部设计的关键部分,...
在使用 Lucene 进行信息检索时,有时我们需要对建立的索引进行查看、调试或分析,这时就需要借助 Lucene 的索引查看工具。 Luke 是一个非常实用的 Lucene 索引浏览器,全称为 Lucidworks Luke。它允许用户以图形化...
**Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...
《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...