`
xusulong
  • 浏览: 80983 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

初始lucene

阅读更多

刚开始接触Lucene,看到好多推荐Lucene in action
虽然代码用的是lucene 1,但原理讲的很清楚,稍作修改即可。

下面给出lucene最简单的一个应用实例,从书上修改而来
Lucene in action 中用的为Lucene 1,我用lucene 2来实现了Lucene in action 第一章 初始Lucene

 

索引过程:


核心类:
IndexWriter, Directory, Analyzer, Document, Field

Indexer如下

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

/**
 * @author xusulong
 *
 */
public class Indexer {
	public static void main(String[] args) throws Exception {
		File indexDir = new File("D:\\index");
		File dataDir = new File("D:\\lucene-2.4.1");
		
		long start = new Date().getTime();
		int numIndexed = index(indexDir, dataDir);
		long end = new Date().getTime();
		
		System.out.println("Indexing " + numIndexed + " files took "
				+ (end - start) + " milliseconds");
	}
	
	public static int index(File indexDir, File dataDir) throws IOException{
		if(!dataDir.exists() || !dataDir.isDirectory()) {
			throw new IOException(dataDir + " does not exixt or is not a diretory");
		}
		//创建lucene索引
		IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
		writer.setUseCompoundFile(false);
		
		indexDirectory(writer, dataDir);
		
		int numIndexed = writer.maxDoc();
		writer.optimize();
		writer.close();		//关闭索引
		return numIndexed;
	}
	
	private static void indexDirectory(IndexWriter writer, File dir) throws IOException{
		File[] files = dir.listFiles();
		
		for( int i = 0; i < files.length; i ++) {
			File f = files[i];
			if(f.isDirectory()) {
				indexDirectory(writer, f);//遍历
			} else if(f.getName().toLowerCase().endsWith(".txt")) {
				indexFile(writer, f);
			}
		}
	}
	
	private static void indexFile(IndexWriter writer, File f) throws IOException{
		if(f.isHidden() || !f.exists() || !f.canRead()) {
			return;
		}
		
		System.out.println("Indexing " + f.getCanonicalPath());
		Document doc = new Document();
		//索引文件中的内容
		doc.add(new Field("contents", new FileReader(f)));
		//索引文件名
		doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
		//将Document对象添加到lucene的索引中去
		writer.addDocument(doc);
	}
}

 

搜索过程:


核心类:
IndexSearcher, Term, Query, QueryParser, TopDocs, ScoreDoc

Searcher如下

import java.io.File;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

/**
 * @author xusulong
 * 
 */
public class Searcher {
	public static void main(String[] args) throws Exception {
		File indexDir = new File("D:\\index");
		String q = "lucene";

		if (!indexDir.exists() || !indexDir.isDirectory()) {
			throw new Exception(indexDir
					+ " does not exixt or is not a diretory");
		}

		search(indexDir, q);
	}

	public static void search(File indexDir, String q) throws Exception {
		// 打开索引
		Directory fsDir = FSDirectory.getDirectory(indexDir);
		// 对查询的字符串进行解析
		IndexSearcher is = new IndexSearcher(fsDir);
		QueryParser parser = new QueryParser("contents", new StandardAnalyzer());
		Query query = parser.parse(q);
		long start = new Date().getTime();
		// 搜索索引
		TopDocs topDocs = is.search(query, 100);
		ScoreDoc[] hits = topDocs.scoreDocs;

		long end = new Date().getTime();
		System.out.println("Found " + hits.length + " document(s) (in "
				+ (end - start) + " milliseconds) that mactched query '" + q
				+ "':");
		for (int i = 0; i < hits.length; i++) {
			int docId = hits[i].doc;
			// 检索匹配到的文件,显示文件名
			Document doc = is.doc(docId);
			System.out.println(docId + ": " + doc.get("filename"));
		}
	}
}

 

结果

两个程序都在我的机器上运行成功(windows xp),结果如下:

Indexer:
Indexing D:\lucene-2.4.1\BUILD.txt
Indexing D:\lucene-2.4.1\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\java\org\apache\lucene\analysis\nl\stems.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\java\org\apache\lucene\analysis\nl\words.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\de\data.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\stemsUnicode.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\test1251.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\testKOI8.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\testUnicode.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\wordsUnicode.txt
Indexing D:\lucene-2.4.1\contrib\ant\src\test\org\apache\lucene\ant\test.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\src\test\org\apache\lucene\benchmark\quality\trecQRels.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\src\test\org\apache\lucene\benchmark\quality\trecTopics.txt
Indexing D:\lucene-2.4.1\contrib\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\memory\src\test\org\apache\lucene\index\memory\testqueries.txt
Indexing D:\lucene-2.4.1\contrib\memory\src\test\org\apache\lucene\index\memory\testqueries2.txt
Indexing D:\lucene-2.4.1\contrib\miscellaneous\README.txt
Indexing D:\lucene-2.4.1\contrib\queries\README.txt
Indexing D:\lucene-2.4.1\contrib\similarity\README.txt
Indexing D:\lucene-2.4.1\contrib\snowball\LICENSE.txt
Indexing D:\lucene-2.4.1\contrib\snowball\README.txt
Indexing D:\lucene-2.4.1\contrib\snowball\SNOWBALL-LICENSE.txt
Indexing D:\lucene-2.4.1\contrib\surround\README.txt
Indexing D:\lucene-2.4.1\contrib\wordnet\README.txt
Indexing D:\lucene-2.4.1\contrib\xml-query-parser\src\test\org\apache\lucene\xmlparser\reuters21578.txt
Indexing D:\lucene-2.4.1\docs\skin\images\README.txt
Indexing D:\lucene-2.4.1\docs\skin\note.txt
Indexing D:\lucene-2.4.1\LICENSE.txt
Indexing D:\lucene-2.4.1\NOTICE.txt
Indexing D:\lucene-2.4.1\README.txt
Indexing D:\lucene-2.4.1\src\jsp\README.txt
Indexing 32 files took 657 milliseconds

Searcher:

Found 14 document(s) (in 15 milliseconds) that mactched query 'lucene':
30: D:\lucene-2.4.1\README.txt
24: D:\lucene-2.4.1\contrib\wordnet\README.txt
17: D:\lucene-2.4.1\contrib\miscellaneous\README.txt
19: D:\lucene-2.4.1\contrib\similarity\README.txt
21: D:\lucene-2.4.1\contrib\snowball\README.txt
31: D:\lucene-2.4.1\src\jsp\README.txt
0: D:\lucene-2.4.1\BUILD.txt
29: D:\lucene-2.4.1\NOTICE.txt
23: D:\lucene-2.4.1\contrib\surround\README.txt
11: D:\lucene-2.4.1\contrib\benchmark\CHANGES.txt
14: D:\lucene-2.4.1\contrib\CHANGES.txt
18: D:\lucene-2.4.1\contrib\queries\README.txt
1: D:\lucene-2.4.1\CHANGES.txt
28: D:\lucene-2.4.1\LICENSE.txt

 

 

0
0
分享到:
评论

相关推荐

    详解SpringBoot+Lucene案例介绍

    在SpringBoot中,我们需要配置Lucene的初始化。我们将创建一个Bean类,用于实例化IndexWriter和IndexSearcher。 IndexWriter用于创建索引,而IndexSearcher用于搜索索引。 在配置中,我们需要注意以下几点: * ...

    lucene3源码分析

    创建IndexWriter对象**:初始化索引写入器。 - **2. 创建文档Document对象,并加入域(Field)**:定义文档结构和内容。 - **3. 将文档加入IndexWriter**:执行文档的索引化操作。 - **4. 将文档加入DocumentsWriter*...

    基于Lucene的Lucene

    1. **初始化索引**: 创建一个Directory对象(如FSDirectory),表示存储索引的物理位置。然后使用IndexWriter实例化,配置Analyzer,开始创建或更新索引。 2. **读取文件**: 逐个读取Word、txt、Html等文件,将每个...

    lucene全文搜素实例 java lucene 实例

    1. **初始化索引目录**:首先,我们需要创建一个目录来存储索引。这通常通过 `FSDirectory.open()` 方法完成。 2. **创建索引**: - 创建 `IndexWriter` 对象,配置分析器和其他参数。 - 使用 `Document` 对象...

    weblucene安装文档

    WebLucene是一款开源的、基于Java开发的全文搜索引擎,它为Web应用提供了强大的搜索功能。在本安装文档中,我们将详细介绍如何一步步地安装并配置WebLucene,以便于你能够快速地将它集成到你的项目中。 首先,我们...

    Lucene索引器实例

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

    Lucene 使用正则表达式

    这段代码初始化了一个`IndexWriter`,用于创建新的索引。`new StandardAnalyzer()`表示使用标准分析器对文本进行分词处理。 2. **文档添加**: ```java Document doc1 = new Document(); Document doc2 = new ...

    基于lucene技术的增量索引

    完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们需要监听数据源的变化。这可以通过数据库触发器、文件系统监控或者消息队列来实现。一旦检测到变化,就需要获取更改的具体...

    lucene 对 xml建立索引

    - 初始化SAX处理器实例,并解析XML文档。 - 处理过程中,通过SAX处理器类的方法来捕获文档结构信息。 3. **创建索引** - 基于解析出的信息,使用Lucene的API创建索引。 - 对于每个文档元素,创建对应的`Field`...

    Lucene group by ,分组实现

    这个类可能会有一个构造函数来初始化分组字段值,以及增加和获取文档计数的方法。 为了动态地处理不同数量的分组字段,可以在 `MultiFieldGroupCollector` 中使用一个映射数据结构(如 `HashMap`),键为分组字段的...

    Lucene3.3.0学习Demo

    - 示例代码展示如何初始化索引目录,创建`IndexWriter`实例,并使用`Document`对象添加字段来构建索引。 - 如何使用`Analyzer`处理文本,例如自定义分词规则。 - `QueryParser`的用法,演示如何从用户输入构建`Query...

    Lucene 索引的简单使用

    Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...

    简单的lucene demo

    通过这两个文件,我们可以了解如何初始化索引器、添加文档到索引、以及如何执行查询来获取匹配的文档。 **详细知识点:** 1. **索引过程**:在`TestLuceneIndex.java`中,首先会创建一个`Directory`对象,如`...

    Lucene简单实例记录

    2. **初始化环境**: - 设置索引目录`indexDir`和数据文件目录`dataDir`。 - 创建一个`Analyzer`对象,用于文本分析和分词处理。例子中使用的是`StandardAnalyzer`,适用于英文文本。对于中文等其他语言,可能需要...

    lucene入门小例子

    1. 初始化:创建Analyzer,用于分词;创建Directory,作为索引的存储位置,如内存目录RAMDirectory或磁盘上的FSDirectory。 2. 创建索引:创建IndexWriter对象,设置Analyzer和Directory,然后逐个添加Document。每...

    SpringBoot+Lucene搜索结果高亮显示Demo

    Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用的初始搭建以及开发过程。通过自动配置和“起步依赖”(Starter POMs)特性,Spring Boot使得创建独立的、生产级别的基于Spring的应用程序变...

    luceneDemo

    1. **初始化索引**: 创建索引目录,使用 IndexWriter 将文档数据写入索引。 2. **查询处理**: 用户在 `search.jsp` 输入查询,该页面将查询字符串发送到服务器。 3. **查询解析**: 后端服务接收到查询后,使用 ...

    Lucene.Net-search

    2. **创建索引**:在应用程序启动时,初始化索引写入器,将数据源中的信息转换为 Lucene 文档,并添加到索引中。 3. **索引更新**:当数据源有新增、修改或删除操作时,同步更新 Lucene 索引。 4. **实现搜索接口*...

    java Lucene 工具类

    1. **初始化索引**:首先,Lucene需要读取数据源(如文件或数据库),然后使用Analyzer进行文本分析,创建索引Writer对象,最后将文档添加到索引中。 2. **索引优化**:索引构建完成后,可能会进行优化操作,合并多...

    Lucene使用代码实例之搜索文档

    总的来说,通过这段代码实例,我们可以了解到使用Lucene进行搜索的基本步骤,包括创建查询对象、初始化`IndexSearcher`、执行查询以及处理搜索结果。掌握这些基本操作,对于理解和应用Lucene进行全文检索至关重要。

Global site tag (gtag.js) - Google Analytics