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

lucene进行全文检索的一个简单例子

阅读更多

    最近在研究关于lucene检索文档的问题,参考网上一些人的例子,但是结果只能检索英文的,有人说要通过中文分词,但我也用了,结果是一样的,不能检索中文。呵呵。。。后来经过一些高手的指点,解决了中文的问题。我用的lucene版本为3.0.2,中文分词是IKAnalyzer3.2.下面是我的一些代码。仅供参考。
第一步:
 建立文件索引:

   public class IndexProcesser {

// 成员变量存储创建的索引文件存放的位置
private static String INDEX_STORE_PATH = "G:\\学习\\Lucene相关\\IndexWriter";
private static String DATA_DIR = "G:\\学习\\Lucene相关\\IndexWriter\\searchFolder";

/**
* 索引dataDir下.txt文件,并储存在indexDir下,返回索引的文件数量
* 
* @param indexDir
* @param dataDir
* @return
* @throws Exception
*/
public static int createIndex(File indexDir, File dataDir) throws Exception {
if (!dataDir.exists() || !dataDir.isDirectory()) {
throw new IOException(dataDir
+ " does not exist or is not a directory");
}
Analyzer analyzer = new IKAnalyzer();//IK分词器,网上还有别的分词器。
IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir),
analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
writer.setMergeFactor(1000);	//合并因子
writer.setMaxBufferedDocs(1000); //最大缓存文档数  
writer.setMaxMergeDocs(Integer.MAX_VALUE); //最大合并文档数
writer.setMaxFieldLength(99999999);//增加内存域长度限制
indexDirectory(writer, dataDir);
int numIndexed = writer.numDocs();
writer.optimize();
writer.close();
return numIndexed;
}

private static void indexDirectory(IndexWriter writer, File dataDir) {
File[] files = dataDir.listFiles();
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isDirectory()) {
indexDirectory(writer, f);
} else {
try {
indexFile(writer, f);
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

private static void indexFile(IndexWriter writer, File f)
throws IOException {
if (f.isHidden() || !f.canRead() || !f.exists()) {
return;
}
System.out.println("indexIng>>" + f.getCanonicalPath());
Document doc = new Document();
doc.add(new Field("filePath", f.getAbsolutePath(), Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("content", readFile(f), Field.Store.YES,
Field.Index.ANALYZED));
writer.addDocument(doc);

}
//readFile()方法主要对你所要检索的文档进行解析,会用到一些相应的组件,如pdf有pdfBox组件,pdfBox对中文支持不好。我用的是xpdf,关于xpdf的配置,会在后面进行说明。word用到的是POI组件,还有别的格式,此处不在详说。
private static String readFile(File f) {
StringBuffer content = null;
FileInputStream is = null;

if (f.getName().endsWith(".doc")) {
content=new StringBuffer();
try{
is=new FileInputStream(f);
WordExtractor wordExtractor=new WordExtractor(is);
content=content.append(wordExtractor.getText());
is.close();
}catch(Exception e){
e.printStackTrace();
}

} else if (f.getName().endsWith(".pdf")) {
String PATH_TO_XPDF="C:\\xpdftest\\xpdf\\pdftotext.exe";
String[] cmd=new String[]{ PATH_TO_XPDF, "-enc", "UTF-8", "-q",f.getAbsoluteFile().toString(), "-" };
try {
Process p=Runtime.getRuntime().exec(cmd);
BufferedInputStream bis=new BufferedInputStream(p.getInputStream());
InputStreamReader reader=new InputStreamReader(bis,"UTF-8");
int len=0;
content=new StringBuffer();
while((len=reader.read())!=-1){
content.append((char)len);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}else{
try {
content = new StringBuffer();
is = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(
is, "GBK"));
for (String line = null; (line = br.readLine()) != null;) {
content.append(line).append("\n");
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return content.toString();
}

public static void main(String[] args) {
long start = new Date().getTime();
int numIndexed = 0;
try {
numIndexed = createIndex(new File(INDEX_STORE_PATH), new File(DATA_DIR));
} catch (Exception e) {
e.printStackTrace();
}
long end = new Date().getTime();

System.out.println("Indexing " + numIndexed + " files took "
+ (end - start) + "  milliseconds");
}

}

 
//xpdf配置说明:
  1.从http://www.foolabs.com/xpdf/download.html上下载xpdf3.02(xpdf-3.02pl2-win32.zip)和xpdf-chinese-simplified.tar.gz。
  2.将xpdf-3.02pl2-win32.zip解压放入c:/xpdf,同时将xpdf-chinese-simplified.tar.gz解压放入到该文件夹内。
  3.打开解压后的xpdf-chinese-simplified文件夹下的add-to-xpdfrc文件,将其内容拷贝到
xpdfrc.txt中,

 

 

修改如下代码:
 #----- begin Chinese Simplified support package (2004-jul-27)
cidToUnicode Adobe-GB1 C:/xpdf/xpdf-chinese-simplified/Adobe-GB1.cidToUnicode
unicodeMap ISO-2022-CN C:/xpdf/xpdf-chinese-simplified/ISO-2022-CN.unicodeMap
unicodeMap EUC-CN  C:/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap
unicodeMap GBK  C:/xpdf/xpdf-chinese-simplified/GBK.unicodeMap
cMapDir  Adobe-GB1 C:/xpdf/xpdf-chinese-simplified/CMap
toUnicodeDir   C:/xpdf/xpdf-chinese-simplified/CMap
fontDir c:/windows/fonts
displayCIDFontTT Adobe-GB1 c:/windows/fonts/simhei(truetype)
textEOL CR+LF
#----- end Chinese Simplified support package

 注意“ C:/xpdf”部分路径,要和你本机的路径一致。

下面就是检索了:
public class Search {

private static String IndexDir="G:\\学习\\Lucene相关\\IndexWriter";
private static String keyWord="努力";
private static int TOP_NUM = 100;

public static void doSearch(File indexDir,String key) throws Exception{
IndexSearcher searcher=new IndexSearcher(FSDirectory.open(indexDir),true);
String field="content";
Query query=IKQueryParser.parse(field, keyWord);
		
		//=========================================================================
		long start=new Date().getTime();
		TopDocs hits=searcher.search(query, TOP_NUM);
		long end = new Date().getTime();//end time
		System.out.println("共找到文档数:"+hits.totalHits);
		 System.out.println("搜索完毕用时:" + (end - start)    + "毫秒");  
		 if(hits.totalHits==0){
			 System.out.println("没有找到您需要的结果!");
		 }else{
			 for(int i=0;i<hits.scoreDocs.length;i++){
				 try{
					 ScoreDoc scoreDoc = hits.scoreDocs[i];// 有变化的地方  
	                    Document doc = searcher.doc(scoreDoc.doc);// 有变化的地方  
	                    System.out.print("这是第" + (i+1) + "个检索结果,文件路径为:");  
	                    System.out.println(doc.get("filePath"));  
				 }catch(Exception e){
					 
				 }
			 }
		 }
searcher.close();   
}
public static void main(String[] args) throws Exception {
File indexDir=new File(IndexDir);
if(!indexDir.isDirectory()||!indexDir.exists()){
throw new Exception(indexDir +
        " does not exist or is not a directory。");
}
doSearch(indexDir, keyWord);
}
}
 

 

 

分享到:
评论

相关推荐

    lucene全文检索简单索引和搜索实例

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene4 全文检索

    作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中进行全文检索变得简单高效。在本文中,我们将深入探讨 Lucene4 的核心概念、工作流程以及如何在实际项目中应用。 ### 1. ...

    lucene例子(一个完整的,lucene例子)(lucenetest.rar,lucene,全文检索,lucene例子)

    lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,lucene,全文检索,lucene例子

    paoding+lucene实现全文检索功能简单实例

    本实例将介绍如何结合Paoding和Lucene来实现一个简单的全文检索系统,这在处理中文数据时尤其有效。 首先,让我们了解一下Paoding。Paoding是一款优秀的中文分词库,它针对中文的特点进行了优化,能有效地进行词语...

    基于Lucene的全文检索引擎研究与应用.pdf

    它不仅是一个简单的检索工具,还是一个可嵌入式的技术组件,可以方便地集成到各种应用系统中,实现针对特定数据集的全文检索功能。Lucene具有以下特点: 1. **跨平台性**:由于采用Java语言开发,Lucene可以在多种...

    使用lucene全文检索数据库

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene 2.4.0版本与Access数据库结合,实现...

    lucene全文检索全面教程

    - **全文检索例子.doc**:这个文档可能包含一个或多个示例,演示如何在实际项目中创建索引、执行查询和处理搜索结果。 - **基于Java的全文索引引擎--Lucene.ppt**:这份PPT可能详细解释了如何在Java应用中集成Lucene...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    Apache Lucene 是一个开源的全文检索库,它提供了一种高效、可扩展的方式来构建全文搜索引擎。在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在...

    Lucene.Net全文检索Demo

    总之,“Lucene.Net全文检索Demo”是一个实用的学习和实践工具,通过它,开发者可以深入了解并掌握Lucene.Net的使用,从而在自己的应用程序中实现高效的全文检索功能。通过阅读提供的文档和运行Demo,你将能够更好地...

    lucene3.0全文检索入门实例

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 Lucene 3.0 实现全文检索的基本步骤...

    lucene3.5全文检索案例lucene+demo

    本篇文章将围绕“lucene3.5全文检索案例lucene+demo”,详细讲解Lucene 3.5的核心概念、关键功能以及如何通过实例进行操作。 一、Lucene 3.5核心概念 1. 文档(Document):Lucene中的最小处理单元,相当于数据库...

    lucene 3.6 全文检索

    在提供的GJSearchDemo.java文件中,可能包含了一个简单的Lucene应用示例,展示了如何使用Lucene进行索引构建和查询操作。通常,这个示例会涉及以下步骤: 1. 初始化Directory,如使用FSDirectory打开一个本地文件夹...

    Lucene全文检索Java实例工程

    Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    Lucene 全文检索的 各种例子

    Lucene是Apache软件基金会的一个开源项目,它提供了一个高效、可扩展的全文检索库。在这个“Lucene全文检索的各种例子”中,我们将探讨如何使用不同的分词器,如ikAnalyzer和smartChineseAnalyzer,来实现中文文本的...

    Lucene实现全文检索

    Apache Lucene是一个高性能、全文检索库,它为Java开发人员提供了一个简单易用的API,用于在各种应用中实现强大的搜索功能。本文将详细介绍如何使用Lucene实现全文检索,并探讨其工作原理。 Lucene的核心概念主要...

    Lucene.net 全文检索

    1. **Analyzer的工作机制**:当创建一个Analyzer实例时,会初始化一个`CloseableThreadLocal`对象,这是一个线程安全的容器,用于存储每个线程的局部变量。在这个容器中,有一个名为`slots`的`WeakHashTable`,用来...

    lucene全文检索案例源码

    在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入探讨Lucene的工作原理及其在实际案例中...

    基于java的Lucene全文搜索引擎资源简单实例下载

    Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,实现全文索引和搜索功能。本资源包提供了一个简单...

    lucene全文检索资源包

    总的来说,"lucene全文检索资源包"是一个学习和理解 Lucene 全文检索技术的基础资料,对于开发者来说,可以通过这个资源包深入理解 Lucene 的工作原理,并以此为基础进行更高级的搜索应用开发。

    lucene检索小例子

    总之,"lucene检索小例子"是一个实用的教程,通过它你可以学习到如何利用Lucene这一强大的全文搜索引擎库,实现高效、精准的文本检索功能。无论是在网站、数据库还是其他任何需要搜索功能的应用中,Lucene都是一个...

Global site tag (gtag.js) - Google Analytics