在构建一个简单的文档库时,需要两个条件,第一,必须能抓取文档的内容,第二,根据抓取的内容构建文档库的索引,然后根据进行搜索。前面两篇博客中介绍的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学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...
这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解并利用Lucene.net来构建高效、功能强大的网站内部搜索引擎。 **一、Lucene.net基础** Lucene.net提供了对文本数据的索引和搜索功能,它...
总的来说,Lucene 3.0 API中文帮助文档是学习和掌握Lucene搜索引擎的关键资源。通过阅读和实践,开发者可以构建出高效的全文检索系统,满足各种复杂的信息检索需求。尽管现在已经有了更新的版本,但3.0版本的API仍然...
**Lucene技术文档doc** **一、Lucene简介** Lucene是Apache软件基金会下的Jakarta项目组的一个核心项目,它是一款高性能、可扩展的全文检索引擎库。作为一个开源的Java库,Lucene提供了完整的搜索功能,包括索引、...
《Lucene 4.6.0官方文档》是针对开源全文搜索引擎库Lucene的一个详尽参考资料,适用于版本4.6.0。Lucene是Apache软件基金会的一个项目,它提供了一个高性能、可扩展的信息检索库,广泛应用于各种搜索应用和信息管理...
通过实际的代码示例,你可以学习到如何初始化索引目录、添加文档、构建查询以及执行搜索操作。例如,你会看到如何使用`Document`类来表示要索引的数据,如何使用`IndexWriter`来创建或更新索引,以及如何使用`...
**Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高...通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的Lucene开发者。
《Lucene:中文全文检索库的核心技术解析》 Lucene,作为开源的全文检索库,是Java语言开发的,广泛应用于各种搜索引擎和信息检索系统中。这个强大的工具提供了高效的索引和搜索功能,使得开发者能够轻松地在大量...
Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会维护。它为开发者提供了一套高级的文本检索和分析工具,使得在各种应用程序中实现全文搜索变得简单易行。Lucene 可以被集成到 Java 开发环境中,同时也支持...
**Lucene学习资料** Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发,是Java编程语言中广泛使用的全文检索引擎库。它提供了文本分析、索引和搜索的基本功能,同时也支持高级搜索语法和查询操作。...
总的来说,"Lucene.Net 2.0 源码+文档"是学习和研究全文检索技术的宝贵资料,无论是对.NET开发人员还是对信息检索感兴趣的人员,都能从中获益匪浅。通过深入研究源码和文档,你可以掌握如何利用Lucene.Net构建高效...
本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...
"lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...
Lucene 是一个强大的全文搜索引擎库,它以 Java 语言实现,并作为 Apache 软件基金会的 Apache Jakarta 项目的一部分开放源代码。Lucene 提供了高效、可扩展的索引和搜索功能,允许开发者轻松地在应用程序中集成高级...
**Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...
Lucene.Net的设计理念是将复杂的搜索引擎技术封装在简单易用的API之下,使得开发者可以专注于应用逻辑,而无需深入理解搜索引擎的底层原理。 在这个个人知识库项目中,开发者可能已经实现了以下关键功能: 1. **...
《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...
通过阅读和理解Lucene.NET的源代码,开发者可以深入学习其内部工作原理,如倒排索引的构建、查询解析的逻辑以及匹配算法等。这对于自定义扩展和优化搜索引擎功能至关重要。 总的来说,Lucene.NET是一个强大的全文...