`
yangwei0915
  • 浏览: 465297 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Lucene学习之构建简单的文档库

 
阅读更多

在构建一个简单的文档库时,需要两个条件,第一,必须能抓取文档的内容,第二,根据抓取的内容构建文档库的索引,然后根据进行搜索。前面两篇博客中介绍的tika和Lucene可以分别满足这两个条件,本篇博客,就结合这两个框架来创建一个简单的文档库,在介绍Lucene入门时,我们使用了FileReader来读入字符文件,在这里我们就要使用tike来读入并解析各种文档了。我们只需要在Lucene入门时所使用的代码中,修改一行代码即可,为了便于大家运行和调试,将全部代码贴出,修改的代码在140行:

 

package com.hsdl.lucene;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CorruptIndexException;
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.IndexWriterConfig.OpenMode;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.apache.tika.Tika;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class LuceneDemo2 {
	private static String contentFieldName = "content";
	private static Tika tika = new Tika();
	public static void main(String[] args) {
//		Analyzer analyzer = new IKAnalyzer();
		Analyzer analyzer = new IKAnalyzer();
		try {
			String docPath = "D:/work/lucene/tika/doc";
			String indexPath = "D:/work/lucene/tika/index";
			//创建索引
			createIndex(analyzer, indexPath, docPath);
			//搜索
			search(analyzer, indexPath, "微信");
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

	/**
	 * 创建索引
	 * 
	 * @param analyzer
	 * @param indexPath
	 * @param docPath
	 * @throws IOException
	 * @throws CorruptIndexException
	 * @throws LockObtainFailedException
	 */
	private static void createIndex(Analyzer analyzer, String indexPath,
			String docPath) throws IOException, CorruptIndexException,
			LockObtainFailedException {
		IndexWriter iwriter;
		Directory directory = FSDirectory.open(new File(indexPath));
		// 配置IndexWriterConfig
		IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_45,
				analyzer);
		iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		iwriter = new IndexWriter(directory, iwConfig);
		File file = new File(docPath);
		indexDocs(iwriter, file);
		iwriter.close();
	}

	/**
	 * 搜索
	 * 
	 * @param analyzer
	 * @param indexPath
	 * @param queryStr
	 * @throws CorruptIndexException
	 * @throws IOException
	 * @throws ParseException
	 */
	private static void search(Analyzer analyzer, String indexPath,
			String queryStr) throws CorruptIndexException, IOException,
			ParseException {
		Directory directory = FSDirectory.open(new File(indexPath));
		// 搜索过程**********************************
		// 实例化搜索器
		IndexReader ireader = DirectoryReader.open(directory);
		IndexSearcher isearcher = new IndexSearcher(ireader);

		// 使用QueryParser查询分析器构造Query对象
		QueryParser qp = new QueryParser(Version.LUCENE_45, contentFieldName, analyzer);
		qp.setDefaultOperator(QueryParser.AND_OPERATOR);
		Query query = qp.parse(queryStr);

		// 搜索相似度最高的10条记录
		TopDocs topDocs = isearcher.search(query, 10);
		System.out.println("命中:" + topDocs.totalHits);
		// 输出结果
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		System.out.println(scoreDocs.length);
		for (int i = 0; i < scoreDocs.length; i++) {
			Document targetDoc = isearcher.doc(scoreDocs[i].doc);
			System.out.println("内容:" + targetDoc.toString());
			System.out.println(targetDoc.get("fileName") + "["
					+ targetDoc.get("path") + "]");
		}
	}
	/**
	 * 根据指定存放内容的文件或目录创建索引
	 * @param iwriter
	 * @param file
	 * @throws IOException
	 */
	public static void indexDocs(IndexWriter iwriter, File file) throws IOException {
		if (file.canRead())
			if (file.isDirectory()) {
				String[] files = file.list();

				if (files != null)
					for (int i = 0; i < files.length; i++)
						indexDocs(iwriter, new File(file, files[i]));
			} else {
				Document doc = null;
				FileInputStream fis=null;
				try {
					doc = new Document();
					doc.add(new StringField("ID", "10000", Field.Store.YES));
					fis = new FileInputStream(file);
					//此处添加文件内容时,需要根据tika获取Reader对象
					doc.add(new TextField(contentFieldName, tika.parse(file)));
					doc.add(new StringField("fileName", file.getName(),
							Field.Store.YES));
					doc.add(new StringField("path", file.getAbsolutePath(),
							Field.Store.YES));
					iwriter.addDocument(doc);
				} finally {
					if(fis!=null){
						fis.close();
					}
				}
			}
	}
}

 

分享到:
评论

相关推荐

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    Lucene.net学习帮助文档

    这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解并利用Lucene.net来构建高效、功能强大的网站内部搜索引擎。 **一、Lucene.net基础** Lucene.net提供了对文本数据的索引和搜索功能,它...

    lucene 3.0 API 中文帮助文档

    总的来说,Lucene 3.0 API中文帮助文档是学习和掌握Lucene搜索引擎的关键资源。通过阅读和实践,开发者可以构建出高效的全文检索系统,满足各种复杂的信息检索需求。尽管现在已经有了更新的版本,但3.0版本的API仍然...

    Lucene技术文档doc

    **Lucene技术文档doc** **一、Lucene简介** Lucene是Apache软件基金会下的Jakarta项目组的一个核心项目,它是一款高性能、可扩展的全文检索引擎库。作为一个开源的Java库,Lucene提供了完整的搜索功能,包括索引、...

    lucene-4.6.0官方文档

    《Lucene 4.6.0官方文档》是针对开源全文搜索引擎库Lucene的一个详尽参考资料,适用于版本4.6.0。Lucene是Apache软件基金会的一个项目,它提供了一个高性能、可扩展的信息检索库,广泛应用于各种搜索应用和信息管理...

    Lucene.net中文帮助文档

    通过实际的代码示例,你可以学习到如何初始化索引目录、添加文档、构建查询以及执行搜索操作。例如,你会看到如何使用`Document`类来表示要索引的数据,如何使用`IndexWriter`来创建或更新索引,以及如何使用`...

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高...通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的Lucene开发者。

    lucene文档,lucene相关文档

    《Lucene:中文全文检索库的核心技术解析》 Lucene,作为开源的全文检索库,是Java语言开发的,广泛应用于各种搜索引擎和信息检索系统中。这个强大的工具提供了高效的索引和搜索功能,使得开发者能够轻松地在大量...

    非常详细的Lucene文档

    Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会维护。它为开发者提供了一套高级的文本检索和分析工具,使得在各种应用程序中实现全文搜索变得简单易行。Lucene 可以被集成到 Java 开发环境中,同时也支持...

    lucene学习资料

    **Lucene学习资料** Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发,是Java编程语言中广泛使用的全文检索引擎库。它提供了文本分析、索引和搜索的基本功能,同时也支持高级搜索语法和查询操作。...

    Lucene.Net 2.0 源码+文档

    总的来说,"Lucene.Net 2.0 源码+文档"是学习和研究全文检索技术的宝贵资料,无论是对.NET开发人员还是对信息检索感兴趣的人员,都能从中获益匪浅。通过深入研究源码和文档,你可以掌握如何利用Lucene.Net构建高效...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene学习pdf2

    "lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    lucene学习lucene学习

    Lucene 是一个强大的全文搜索引擎库,它以 Java 语言实现,并作为 Apache 软件基金会的 Apache Jakarta 项目的一部分开放源代码。Lucene 提供了高效、可扩展的索引和搜索功能,允许开发者轻松地在应用程序中集成高级...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    基于lucene.net开发的个人知识库

    Lucene.Net的设计理念是将复杂的搜索引擎技术封装在简单易用的API之下,使得开发者可以专注于应用逻辑,而无需深入理解搜索引擎的底层原理。 在这个个人知识库项目中,开发者可能已经实现了以下关键功能: 1. **...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...

    Lucene.net源码及中文文档

    通过阅读和理解Lucene.NET的源代码,开发者可以深入学习其内部工作原理,如倒排索引的构建、查询解析的逻辑以及匹配算法等。这对于自定义扩展和优化搜索引擎功能至关重要。 总的来说,Lucene.NET是一个强大的全文...

Global site tag (gtag.js) - Google Analytics