`
conkeyn
  • 浏览: 1529048 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Lucence 4.0的入门示例

 
阅读更多

几年前学了2.2版本的,一直没有机会有使用到Lucense。给忘了差不多了,只留下一些简单印象。现在重新学习!

 

自己的测试用例:

 

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StoredField;
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.Filter;
import org.apache.lucene.search.IndexSearcher;
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.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class HelloWorld {

	private static String filePath = "D:\\workspace-java\\lucence\\data_sources\\20121212.txt";

	private static String indexDir = "D:\\workspace-java\\lucence\\index_dir";

	private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);

	@Test
	public void createIndex() {
		File f = new File(filePath);
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		StringField name = new StringField("name", f.getName(), Store.YES);
		TextField content = new TextField("content", File2DocumentUtils.readFileContent(filePath), Store.YES);
		StringField path = new StringField("path", f.getAbsolutePath(), Store.YES);
		// StringField date = new StringField("date",df.format(new Date()),Store.YES);
		// 表示只存储,不进行索引
		StoredField date = new StoredField("date", df.format(new Date()));
		LongField size = new LongField("size", f.length(), Store.YES);
		Document doc = new Document();
		doc.add(name);
		doc.add(content);
		doc.add(path);
		doc.add(date);
		doc.add(size);
		Directory directory = null;
		try {
			directory = new SimpleFSDirectory(new File(indexDir));
			IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
			config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
			IndexWriter indexWriter = new IndexWriter(directory, config);
			indexWriter.addDocument(doc);
			indexWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void searchText() {
		// MultiPhraseQuery q = new MultiPhraseQuery();
		// q.add(new Term("bride"));
		//term表示查询条件。第一参数为将要查询的字段;第二参数为要查询的语句
		TermQuery q = new TermQuery(new Term("content", "dresses"));
		Directory directory = null;
		IndexReader indexReader = null;
		try {
			directory = new SimpleFSDirectory(new File(indexDir));
			indexReader = DirectoryReader.open(directory);

			IndexSearcher indexSearcher = new IndexSearcher(indexReader);
			Filter filter = null;
			TopDocs results = indexSearcher.search(q, filter, 100);
			System.out.println("Total hits:" + results.totalHits);
			ScoreDoc[] hits = results.scoreDocs;

			for (ScoreDoc hit : hits) {
				Document d = indexSearcher.doc(hit.doc);
				System.out.println(d.getField("name").stringValue() + ",score:" + hit.score);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null) {
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}
 

 

 

从其他网看到的示例:

http://www.cnblogs.com/sunxucool/archive/2012/12/03/2799805.html

 

import java.io.File;
import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.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.search.TopScoreDocCollector;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class IndexTools {
	/**
	 * 获得indexwriter对象
	 * 
	 * @param dir
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	private IndexWriter getIndexWriter(Directory dir, Analyzer analyzer) throws IOException {
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer);
		return new IndexWriter(dir, iwc);
	}

	/**
	 * 关闭indexwriter对象
	 * 
	 * @throws IOException
	 * 
	 * @throws Exception
	 */
	private void closeWriter(IndexWriter indexWriter) throws IOException {
		if (indexWriter != null) {
			indexWriter.close();
		}
	}

	/**
	 * 创建索引
	 * 
	 * @throws InvalidTokenOffsetsException
	 */
	public void createIndex() throws InvalidTokenOffsetsException {
		String indexPath = "D://luceneindex"; // 建立索引文件的目录
		// 默认IKAnalyzer()-false:实现最细粒度切分算法,true:分词器采用智能切分
		Analyzer analyzer = new IKAnalyzer(true);
		IndexWriter indexWriter = null;
		Directory directory = null;
		try {
			directory = FSDirectory.open(new File(indexPath));
			indexWriter = getIndexWriter(directory, analyzer);
		} catch (Exception e) {
			System.out.println("索引打开异常!");
		}
		// 添加索引
		try {
			Document document = new Document();
			document.add(new TextField("filename", "标题:起点", Store.YES));
			document.add(new TextField("content", "内容:我是一名程序员", Store.YES));
			indexWriter.addDocument(document);
			Document document1 = new Document();
			document1.add(new TextField("filename", "标题:终点", Store.YES));
			document1.add(new TextField("content", "内容:我不再只是程序员", Store.YES));
			indexWriter.addDocument(document1);
			indexWriter.commit();
		} catch (IOException e1) {
			System.out.println("索引创建异常!");
		}
		try {
			closeWriter(indexWriter);
		} catch (Exception e) {
			System.out.println("索引关闭异常!");
		}
	}

	/**
	 * 搜索
	 * 
	 * @throws ParseException
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	@SuppressWarnings("deprecation")
	public void searchIndex() throws ParseException, IOException, InvalidTokenOffsetsException {
		String indexPath = "D://luceneindex"; // 建立索引文件的目录
		// 默认IKAnalyzer()-false:实现最细粒度切分算法,true:分词器采用智能切分
		Analyzer analyzer = new IKAnalyzer(true);
		Directory directory = null;
		try {
			directory = FSDirectory.open(new File(indexPath));
		} catch (Exception e) {
			System.out.println("索引打开异常!");
		}
		IndexReader ireader = null;
		IndexSearcher isearcher = null;
		try {
			ireader = IndexReader.open(directory);
		} catch (IOException e) {
			System.out.println("打开索引文件!");
		}
		isearcher = new IndexSearcher(ireader);
		String keyword = "程序员";
		// 使用QueryParser查询分析器构造Query对象
		// eg:单个字段查询
		// String fieldName = "content";
		// QueryParser qp = new QueryParser(Version.LUCENE_40, fieldName, analyzer);
		String[] fields = { "filename", "content" };
		QueryParser qp = new MultiFieldQueryParser(Version.LUCENE_40, fields, analyzer);
		qp.setDefaultOperator(QueryParser.AND_OPERATOR);
		Query query = qp.parse(keyword);
		// 搜索相似度最高的5条记录
		TopDocs topDocs = isearcher.search(query, 25);
		System.out.println("命中:" + topDocs.totalHits);
		// 输出结果
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		for (int i = 0; i < topDocs.totalHits; i++) {
			Document targetDoc = isearcher.doc(scoreDocs[i].doc);
			System.out.println("内容:" + targetDoc.toString());
		}
		// 分页,高亮显示
		higherIndex(analyzer, isearcher, query, topDocs);
	}

	public static void main(String[] args) {
		IndexTools tool = new IndexTools();
		try {
			tool.searchIndex();
		} catch (ParseException e) {
			System.out.println("解析错误");
		} catch (IOException e) {
			System.out.println("读取文件流错误");
		} catch (InvalidTokenOffsetsException e) {
			System.out.println("查询失败");
		}
	}

	/**
	 * 分页,高亮显示
	 * 
	 * @param analyzer
	 * @param isearcher
	 * @param query
	 * @param topDocs
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	public void higherIndex(Analyzer analyzer, IndexSearcher isearcher, Query query, TopDocs topDocs) throws IOException, InvalidTokenOffsetsException {
		TopScoreDocCollector results = TopScoreDocCollector.create(topDocs.totalHits, false);
		isearcher.search(query, results);
		// 分页取出指定的doc(开始条数, 取几条)
		ScoreDoc[] docs = results.topDocs(1, 2).scoreDocs;
		for (int i = 0; i < docs.length; i++) {
			Document targetDoc = isearcher.doc(docs[i].doc);
			System.out.println("内容:" + targetDoc.toString());
		}
		// 关键字高亮显示的html标签,需要导入lucene-highlighter-3.5.0.jar
		SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
		Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
		for (int i = 0; i < docs.length; i++) {
			Document doc = isearcher.doc(docs[i].doc);
			// 标题增加高亮显示
			TokenStream tokenStream1 = analyzer.tokenStream("filename", new StringReader(doc.get("filename")));
			String title = highlighter.getBestFragment(tokenStream1, doc.get("filename"));
			// 内容增加高亮显示
			TokenStream tokenStream2 = analyzer.tokenStream("content", new StringReader(doc.get("content")));
			String content = highlighter.getBestFragment(tokenStream2, doc.get("content"));
			System.out.println(doc.get("filename") + " : " + title + " : " + content);
		}
	}
}
 

 

 

d

分享到:
评论

相关推荐

    lucene4.0简单的新增和查询

    **Lucene 4.0 简单的新增和查询** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。版本 4.0 的发布为开发者提供了更高效、更灵活的搜索解决方案。这个样例项目旨在演示如何在 Lucene 4.0 中实现基本的...

    lucence3.6.1 示例完整包

    《Lucene 3.6.1 入门与实践指南》 Lucene 是一个高性能、全文本搜索引擎库,被广泛应用于各种系统中进行文本检索。本文将深入探讨Lucene 3.6.1版本,结合“庖丁解牛”分词器以及其在数据库表索引、文件索引及分页...

    lucence入门HelloWorld

    **Lucene 入门教程** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、可扩展的、完全免费的搜索程序开发框架,使开发者能够轻松地在自己的应用...

    lucene-5.3.0+solr-5.3.0 jar包和文档示例

    Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。...

    Lucence简介以及应用

    Lucence的描述以及重要的几个方法详解说明,Lucence的应用以及实例

    lucence学习笔记

    lucence学习笔记,中文的,适用于初学者学习,知识点案例较多。

    全文检索lucence3.5+IKAnalzers3.5示例

    **全文检索Lucene 3.5 + IKAnalyzer 3.5 示例** 全文检索在现代互联网应用中扮演着至关重要的角色,它使得用户可以快速、准确地找到所需信息。本示例将详细介绍如何在Java环境中使用Lucene 3.5版本结合IKAnalyzer ...

    lucence教程

    lucence教程,通过这份文档可以学习lucence的相关知识

    lucence 测试代码可运行

    这个“lucence 测试代码可运行”项目提供了一个简单的 Lucene 应用示例,方便初学者快速上手。在 Eclipse 开发环境中,你只需将包含的 jar 文件导入到项目类路径,即可直接运行代码。 首先,理解 Lucene 的基本工作...

    lucence jar.4.6.0版本所需jar包集合

    Lucence是一款开源的全文搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的高级工具。这个"lucence jar.4.6.0版本所需jar包集合"是针对Lucence 4.6.0版本的一个完整依赖包集合,包含了运行和开发...

    Lucence和Hadoop学习资料

    《Lucence和Hadoop学习资料》是一份涵盖了两个重要大数据技术——Lucene和Hadoop的综合学习资源。Lucene是一个高性能、全文检索库,而Hadoop则是分布式计算框架的代表,两者在现代大数据处理和搜索领域中发挥着关键...

    Lucence查询的实现

    - **代码示例**: ```java Analyzer analyzer = new IKAnalyzer(); ``` - **解析**:`IKAnalyzer`是一种常用的分词器,用于将输入的文本分割成一系列的词语。这一步是Lucene处理文本数据的基础,不同的分词器会...

    lucence全文检索引擎

    通过提供的“lucence”压缩包,你可以深入学习Lucene的开发文档,观看视频教程,并使用提供的开发jar包进行实践操作,逐步掌握这个强大的全文检索引擎。在实际项目中,结合具体的业务需求,灵活运用Lucene的各项功能...

    lucence视频全面例子

    《Lucene全方位实战指南》 Lucene,作为Apache软件基金会的一个开源项目,是Java语言实现的全文搜索引擎库。它提供了一个高效、可扩展的基础架构,用于在各种应用程序中实现全文检索功能。本教程将深入探讨Lucene的...

    springboot整合lucence完整代码

    SpringBoot整合Lucene是一个常见的需求,特别是在构建高性能的全文搜索引擎时。Lucene是Apache软件基金会的一个开源项目,它提供了一个高性能、全文本搜索库。SpringBoot则是基于Spring框架的简化版,旨在简化Spring...

    lucence完整项目

    示例项目结构** 从文件名 "lucene0210_02" 我们无法直接获取具体文件内容,但通常一个完整的 Lucene 项目会包含以下部分: - **源代码**:Java 文件,展示了如何创建、添加和搜索索引。 - **配置文件**:可能包含...

    Lucence高亮显示的实现

    ### Lucene高亮显示实现详解 #### 一、引言 在搜索引擎开发中,为了提升用户体验,往往需要对搜索结果中的关键词进行高亮处理。这样不仅可以让用户一眼就能看到搜索结果与他们输入的关键词之间的关联性,同时也有...

    Lucence的资料和例子

    - 课件中的示例可能涵盖了如何初始化Directory、创建IndexWriter,添加、删除和更新文档,以及如何构建和执行查询。 - 项目总结部分可能分享了实际开发中遇到的问题、解决方案,以及优化技巧,如索引性能调优、...

    lucence 索引合并 汇总

    ### Lucene索引合并知识点详解 #### 一、Lucene简介 Apache Lucene是一个高性能、全功能的文本搜索引擎库。它提供了一套完整的文本搜索功能,包括全文检索、索引创建与管理等,并且可以非常方便地嵌入到Java应用...

Global site tag (gtag.js) - Google Analytics