最近在研究关于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是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中进行全文检索变得简单高效。在本文中,我们将深入探讨 Lucene4 的核心概念、工作流程以及如何在实际项目中应用。 ### 1. ...
lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,lucene,全文检索,lucene例子
本实例将介绍如何结合Paoding和Lucene来实现一个简单的全文检索系统,这在处理中文数据时尤其有效。 首先,让我们了解一下Paoding。Paoding是一款优秀的中文分词库,它针对中文的特点进行了优化,能有效地进行词语...
它不仅是一个简单的检索工具,还是一个可嵌入式的技术组件,可以方便地集成到各种应用系统中,实现针对特定数据集的全文检索功能。Lucene具有以下特点: 1. **跨平台性**:由于采用Java语言开发,Lucene可以在多种...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene 2.4.0版本与Access数据库结合,实现...
- **全文检索例子.doc**:这个文档可能包含一个或多个示例,演示如何在实际项目中创建索引、执行查询和处理搜索结果。 - **基于Java的全文索引引擎--Lucene.ppt**:这份PPT可能详细解释了如何在Java应用中集成Lucene...
Apache Lucene 是一个开源的全文检索库,它提供了一种高效、可扩展的方式来构建全文搜索引擎。在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在...
总之,“Lucene.Net全文检索Demo”是一个实用的学习和实践工具,通过它,开发者可以深入了解并掌握Lucene.Net的使用,从而在自己的应用程序中实现高效的全文检索功能。通过阅读提供的文档和运行Demo,你将能够更好地...
Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 Lucene 3.0 实现全文检索的基本步骤...
本篇文章将围绕“lucene3.5全文检索案例lucene+demo”,详细讲解Lucene 3.5的核心概念、关键功能以及如何通过实例进行操作。 一、Lucene 3.5核心概念 1. 文档(Document):Lucene中的最小处理单元,相当于数据库...
在提供的GJSearchDemo.java文件中,可能包含了一个简单的Lucene应用示例,展示了如何使用Lucene进行索引构建和查询操作。通常,这个示例会涉及以下步骤: 1. 初始化Directory,如使用FSDirectory打开一个本地文件夹...
Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...
Lucene是Apache软件基金会的一个开源项目,它提供了一个高效、可扩展的全文检索库。在这个“Lucene全文检索的各种例子”中,我们将探讨如何使用不同的分词器,如ikAnalyzer和smartChineseAnalyzer,来实现中文文本的...
Apache Lucene是一个高性能、全文检索库,它为Java开发人员提供了一个简单易用的API,用于在各种应用中实现强大的搜索功能。本文将详细介绍如何使用Lucene实现全文检索,并探讨其工作原理。 Lucene的核心概念主要...
1. **Analyzer的工作机制**:当创建一个Analyzer实例时,会初始化一个`CloseableThreadLocal`对象,这是一个线程安全的容器,用于存储每个线程的局部变量。在这个容器中,有一个名为`slots`的`WeakHashTable`,用来...
在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入探讨Lucene的工作原理及其在实际案例中...
Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,实现全文索引和搜索功能。本资源包提供了一个简单...
总的来说,"lucene全文检索资源包"是一个学习和理解 Lucene 全文检索技术的基础资料,对于开发者来说,可以通过这个资源包深入理解 Lucene 的工作原理,并以此为基础进行更高级的搜索应用开发。
总之,"lucene检索小例子"是一个实用的教程,通过它你可以学习到如何利用Lucene这一强大的全文搜索引擎库,实现高效、精准的文本检索功能。无论是在网站、数据库还是其他任何需要搜索功能的应用中,Lucene都是一个...