`
BuN_Ny
  • 浏览: 85504 次
  • 来自: 济南
社区版块
存档分类
最新评论

3) 第一章 初识Lucene:一个简单的实例

阅读更多

还是看代码来的直接:

 

1. 索引

 

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

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;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

/**
 * Lucene索引类示例
 * 代码摘自 Lucene In Action 2nd Edition
 */
public class Indexer {

	public static void main(String[] args) throws Exception {
		if (args.length != 2) {
			throw new Exception("Usage: java " + Indexer.class.getName()
					+ " <index dir> <data dir>");
		}
		// 1 Lucene索引文件存放的位置
		String indexDir = args[0]; 
		// 2 索引此目录下的 *.txt 文件
		String dataDir = args[1];  
		
		long start = System.currentTimeMillis();
		Indexer indexer = new Indexer(indexDir);
		int numIndexed = indexer.index(dataDir);
		indexer.close();
		long end = System.currentTimeMillis();
		System.out.println("Indexing " + numIndexed + " files took "
				+ (end - start) + " milliseconds");
	}

	private IndexWriter writer;

	public Indexer(String indexDir) throws IOException {
		Directory dir = new SimpleFSDirectory(new File(indexDir), null);
		// 3 创建Lucene的 IndexWriter 类
		writer = new IndexWriter( dir, 
				new StandardAnalyzer(Version.LUCENE_30), true,
				IndexWriter.MaxFieldLength.UNLIMITED);
	}

	public void close() throws IOException {
		// 4 关闭IndexWriter
		writer.close(); 
	}

	public int index(String dataDir) throws Exception {
		File[] files = new File(dataDir).listFiles();
		for (int i = 0; i < files.length; i++) {
			File f = files[i];
			if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead()
					&& acceptFile(f)) {
				indexFile(f);
			}
		}
		// 5 返回被索引的文档的数量
		return writer.numDocs(); 
	}

	protected boolean acceptFile(File f) {
		// 6 仅索引 .txt 文件类型
		return f.getName().endsWith(".txt");
	}

	protected Document getDocument(File f) throws Exception {
		Document doc = new Document();
		// 7 索引文件的文本内容
		doc.add(new Field("contents", new FileReader(f))); 
		// 8 索引文件路径
		doc.add(new Field("filename", f.getCanonicalPath(), 
				Field.Store.YES, Field.Index.NOT_ANALYZED));
		return doc;
	}

	private void indexFile(File f) throws Exception {
		System.out.println("Indexing " + f.getCanonicalPath());
		Document doc = getDocument(f);
		if (doc != null) {
			// 9 将document添加到索引中
			writer.addDocument(doc); 
		}
	}
}

 

2. 搜索

 

import java.io.File;

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.SimpleFSDirectory;
import org.apache.lucene.util.Version;

/**
 * Lucene搜索类示例
 * 代码摘自 Lucene In Action 2nd Edition
 */
public class Searcher {
	
	public static void main(String[] args) throws Exception {
		if (args.length != 2) {
			throw new Exception("Usage: java " + Searcher.class.getName() + " <index dir> <query>");
		}
		//1 由Indexer类创建的索引文件的位置
		String indexDir = args[0]; 
		//2 查询条件
		String q = args[1];
		search(indexDir, q);
	}
	
	public static void search(String indexDir, String q) throws Exception {
		
		Directory dir = new SimpleFSDirectory(new File(indexDir), null);
		//3 打开索引文件
		IndexSearcher is = new IndexSearcher(dir); 
		
		//4 分析查询条件
		QueryParser parser = new QueryParser(
				Version.LUCENE_30,
				"contents",
				new StandardAnalyzer(Version.LUCENE_30));
		Query query = parser.parse(q);
		
		long start = System.currentTimeMillis();
		//5 搜索索引 TopDocs对象仅保存对底层文档的引用,第7步才实际加载
		TopDocs hits = is.search(query, 10);
		long end = System.currentTimeMillis();
		
		//6 输出一些基本查询信息
		System.err.println(
				"Found " + hits.totalHits + " document(s) (in " + 
				(end - start) + " milliseconds) that matched query '" +
				q + "':"); 
		
		for(int i=0;i<hits.scoreDocs.length;i++) {
			ScoreDoc scoreDoc = hits.scoreDocs[i];
			//7 检索符合的文档
			Document doc = is.doc(scoreDoc.doc); 
			//8 输出符合的文件名
			System.out.println(doc.get("filename"));
		}
		//9 关闭索引
		is.close();
	}
}
 
分享到:
评论
2 楼 BuN_Ny 2012-02-28  
shantouyyt 写道
请问下,当索引的时候,用的是这种方式,new FileReader(f)
// 7 索引文件的文本内容 
        doc.add(new Field("contents", new FileReader(f)));

那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??

还有一个问题,高亮显示的时候,如果用的是  doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);

Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));


没有设置Store的话是需要根据filename找到文本的。文本内容过长的话,可以存一些摘要。
后面的高亮问题没懂。
1 楼 shantouyyt 2012-02-28  
请问下,当索引的时候,用的是这种方式,new FileReader(f)
// 7 索引文件的文本内容 
        doc.add(new Field("contents", new FileReader(f)));

那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??

还有一个问题,高亮显示的时候,如果用的是  doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);

Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));

相关推荐

    lucene全文搜素实例 java lucene 实例

    Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索操作。 ### 一、Lucene 基本概念 1. **索引(Index...

    Lucene:基于Java的全文检索引擎简介

    Lucene是一个基于Java的全文索引工具包。 1. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    精品资料(2021-2022收藏)Lucene:基于Java的全文检索引擎简介.doc

    Lucene是一个由Java编写的开源全文检索引擎工具包,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分。它不是一个独立的全文检索应用,而是提供了一个可扩展的框架,用于集成到其他应用程序中,...

    指南-Lucene:ES篇.md

    指南-Lucene:ES篇.md

    lucene实例lucene实例

    1. 复合段(Compound Segment):为了提高检索效率,Lucene会合并多个小段成一个大段。 2. 倒排索引(Inverted Index):Lucene的核心数据结构,它将词典映射到包含该词的文档集合。 3. 评分系统(Scoring):...

    Lucene索引器实例

    以下是一个简单的Java代码示例,展示了如何创建和使用Lucene索引器: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache....

    lucene3 例子

    博文链接中提到的是一个关于Lucene3的博客文章,可能详细介绍了如何在实际项目中使用Lucene进行全文检索。博主"chinaxxren"在ITEYE上分享了这篇博客,虽然具体内容未在描述中给出,但我们可以推测博主可能讲解了以下...

    第一个lucene的简单实例....

    标题 "第一个lucene的简单实例" 提到的是关于Apache Lucene的初步应用,这是一个全文搜索引擎库,常用于Java开发中。Lucene提供了高效的文本搜索功能,使得开发者能够快速地在大量数据中查找相关信息。 描述中的 ...

    lucene:基于Java的全文检索引擎简介

    尽管Lucene本身不是一个现成的应用程序,但它提供了一套丰富的API,使得开发者能够轻松地将搜索功能集成到他们的软件产品或服务中。 **作者与历史**: - **作者**:Lucene最初由Doug Cutting创建。Cutting是一位...

    Lucene:基于Java的全文检索引擎简介.rar

    Lucene的主要目标是为开发者提供一个简单易用的API,让他们能够快速地在应用程序中实现全文检索功能。 **一、Lucene的核心组件** 1. **索引(Indexing)**:Lucene首先将非结构化的文本数据转换为倒排索引...

    Java搜索工具——Lucene实例总结(一)

    通过实例,我们可以创建一个简单的索引器,将文本文件或数据库内容导入Lucene索引,然后编写一个搜索引擎来查询这些内容。这通常涉及以下步骤: - 创建索引:定义Document结构,使用Analyzer处理Field,通过...

    一个关于lucene实例

    在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括文档的索引和搜索。在索引过程中,它能够分析文本,将文本分词,然后将这些词语转换为...

Global site tag (gtag.js) - Google Analytics