`

Lucene 构建索引

 
阅读更多

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 索引小示例

    在创建索引时,Lucene会对文档进行分词,生成一系列的关键词(也称为术语或Token),然后构建倒排索引。倒排索引是一种数据结构,它将每个关键词与包含该关键词的文档位置相关联,使得我们可以迅速找到包含特定词汇...

    lucene:lucene构建索引,从HelloWorld到项目具体使用

    lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....

    深入 Lucene 索引机制深入 Lucene 索引机制

    这些示例代码可以帮助开发者理解如何使用Lucene构建索引,以及如何执行搜索操作。 总结来说,Lucene的索引机制是其高效搜索能力的关键。通过建立倒排索引,Lucene能够在大量数据中快速找到匹配的文档,使得全文检索...

    基于lucene技术的增量索引

    通过上述步骤,我们可以构建一个基于Lucene的增量索引系统,高效地处理数据变化,同时保持搜索效率。在实际应用中,还需要结合具体的业务需求和数据特性进行定制化开发。通过持续监控和优化,我们可以确保系统的稳定...

    Lucene读取索引文件

    《深入理解Lucene:解析索引文件的读取》 Lucene,作为一款强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。它的核心功能之一就是构建和读取索引文件,以高效地进行文本搜索。本文将深入探讨Lucene如何读取...

    基于lucene的索引与搜索

    本文档主要探讨了基于Apache Lucene的索引与搜索技术,这是构建高效全文搜索引擎的关键组成部分。Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言...

    lucene实现索引查询

    Lucene 是一个高性能、全文本搜索库,被广泛用于构建高效的搜索引擎和信息检索系统。它提供了完整的搜索功能,包括分析、索引、查询以及结果排序等。在Java开发中,Lucene 提供了丰富的API来简化这些操作。以下是...

    lucene并行索引

    然而,在面对海量数据时,Lucene的索引构建过程可能会变得非常耗时,从而影响用户体验。因此,开发一种基于Lucene的分布式并行索引技术显得尤为重要。 #### 二、Lucene基础概述 Lucene是一个高性能、全功能的文本...

    lucene 对 xml建立索引

    - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索功能。 - Lucene的核心能力在于文档索引和查询,它提供了强大的API来实现高效的文档检索。 2. **XML简介** - XML(Extensible Markup ...

    Lucene之删除索引

    在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...

    lucene 7索引查看工具 -luke-7.2.0-luke-release.zip

    Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容。luke 7.2.0 支持最新的 lucene7 索引查看 github地址:https://github.com/DmitryKey/luke/releases

    lucene索引查看程序及代码

    通过阅读和分析源代码,我们可以学习到如何操作Lucene索引,以及如何构建类似的工具。 总结而言,luke作为Lucene索引的可视化工具,极大地便利了开发者对索引的理解和调试。无论是初学者还是经验丰富的开发人员,都...

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

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene3.0创建索引

    它为开发者提供了构建搜索应用所需的所有基本工具,包括索引文档、执行查询、处理分析等。Lucene3.0是该系列的一个版本,在性能和稳定性方面都有所提升。 #### 二、创建索引的基本步骤 根据提供的描述,创建索引的...

    Lucene索引器实例

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

    lucene-索引(index).pdf

    Lucene索引的构建和查询都是基于反向索引进行的,这意味着当用户输入查询词时,Lucene能够迅速找到包含这些词的所有文档,而不必遍历整个文档集。 #### 索引文件格式 Lucene索引文件格式是其内部设计的关键部分,...

    lucene索引查看工具及源码

    在使用 Lucene 进行信息检索时,有时我们需要对建立的索引进行查看、调试或分析,这时就需要借助 Lucene 的索引查看工具。 Luke 是一个非常实用的 Lucene 索引浏览器,全称为 Lucidworks Luke。它允许用户以图形化...

    Lucene索引的基本操作

    **Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...

    luke源码--查看lucene索引文件

    《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...

Global site tag (gtag.js) - Google Analytics