`
randychao2008
  • 浏览: 15896 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Lucene3.0 学习笔记(2)

阅读更多
今天针对Lucene3.0的一些新增的特性,做了简单的实践。主要实现了两种索引的建立方法:1.对某一个txt文档进行建立索引并进行搜索。2.对某一个文件夹下的所有txt文件进行建立索引并进行搜索。
有两点发现,在此share一下:
1.在向索引段中添加新的field时,如果用到了new Field("***",Reader reader)是不存储的。所以在doc.get("***");时,无法取出内容,这时就需要自己写一个方法,来实现将reader转化为字符串。
2.在对某一个文件夹下的所有txt文档进行建立索引时,需要对每一个文件都构建一个document对象,然后将field域分别add到document中。否则在搜索的时候将会出错(未知原因,还望那位高人指点一二),并且用Luck工具查看的时候,对于是否给每个文本构建Docment,两种结果内容一样,但是顺序会不同。

[color=green][/color]

package test3;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.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.junit.Test;

public class IndexTxt {

private IndexWriter write = null;
private IndexSearcher search = null;

private String dataPath = "E:\\testlucene\\test\\test.txt";//针对某一个文本文档建立索引并搜索
private String dataPath1 = "E:\\testlucene\\test";//针对某一个文本下所有文档建立索引并搜索
private String indexPath ="E:\\testlucene\\fileIndex";

private Directory indexDir = null;
private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
public IndexTxt() throws IOException{
File file = new File(indexPath);
indexDir = FSDirectory.open(file);//创建索引目录
}
@Test
public void createIndex() throws CorruptIndexException, LockObtainFailedException, IOException{//建立索引
/*
* 先把将要建立索引的文件转化为document对象
*/
Document doc = new Document();
File dataFile = new File(dataPath);
//获取文件输入流

//添加所有field
doc.add(new Field("name",dataFile.getName(),Store.YES,Index.ANALYZED));

//doc.add(new Field("content",reader));//并没有存储,故不能用doc.get("content")来获得内容,so to adapt next line
doc.add(new Field("content",filecontent(dataFile),Store.YES,Index.ANALYZED));
//在哪儿建立索引
write = new IndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);
write.addDocument(doc);
write.close();
}
/*
* 针对某一个文件夹下所有文档建立索引并搜索
*/
@Test
public void createIndex1() throws IOException{//
File folder = new File(dataPath1);
write = new IndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);
if(folder.isDirectory()){
String[] files = folder.list();// 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

for(int i = 0;i<files.length;i++){
File file = new File(folder,files[i]);//根据 parent 抽象路径名和 child 路径名的字符串创建一个新 File 实例。
Document doc = new Document();
doc.add(new Field("name",file.getName(),Store.YES,Index.ANALYZED));
doc.add(new Field("content",filecontent(file),Store.YES,Index.ANALYZED));
write.addDocument(doc);
}
//在哪儿建立索引
write.close();
}else {  
            System.out.println("-----folder.isDirectory():false.");  
        } 
}
private String filecontent(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
StringBuffer content = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
for(String line=null;(line=reader.readLine())!=null;){
content.append(line).append("\n");
}
return content.toString();
}
@Test
public void createSearch() throws CorruptIndexException, IOException, ParseException{
//针对某一个索引目录进行搜索
search = new IndexSearcher(indexDir);
//key --> Query object
String key = "game";
QueryParser parse = new QueryParser(Version.LUCENE_30,"content",analyzer);
Query query = parse.parse(key);//将搜索的关键词转化为Query对象

TopDocs hits = search.search(query, 100);//封装了返回的符合条件的所有记录
int total = hits.totalHits;//返回包含有该关键词的文档个数,切记是文档个数
if(total == 0)
System.out.println("no such a file");
else{
for(int i=0;i<hits.scoreDocs.length;i++){//hits.scoreDocs return The top hits for the query.
ScoreDoc scoreDoc = hits.scoreDocs[i];//返回的符合条件的某一条记录
Document doc = search.doc(scoreDoc.doc);//Returns the stored fields of document i.
System.out.println(doc.get("name"));
System.out.println(doc.get("content"));
System.out.println("----------------");
}
}
}
}
分享到:
评论

相关推荐

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene3.0学习笔记(三)与paoding整合

    《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...

    lucene 3.0 API 中文帮助文档 chm

    lucene 3.0 API中文帮助,学习的人懂得的

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene3.0 分词器

    lucene3.0 中文分词器, 庖丁解牛

    Lucene 3.0 原理与代码分析完整版

    通过对《Lucene 3.0 原理与代码分析完整版》的学习,开发者不仅可以理解Lucene的工作原理,还能掌握如何定制化Lucene以满足特定需求,从而在实际项目中充分利用其强大功能。这本书是深入研究和应用Lucene不可或缺的...

    lucene3.0核心jar包

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发并维护。它提供了高级的文本分析、索引和搜索功能,被广泛应用于...尽管现在已经有了更新的版本,但 Lucene 3.0 仍然是学习和理解全文检索技术的重要里程碑。

    Lucene3.0全文信息检索

    2. **多线程支持**:在3.0版本中,Lucene增强了多线程处理能力,允许在并发环境中更有效地创建和更新索引。 3. **内存管理优化**:Lucene 3.0改进了内存使用策略,降低了内存占用,同时提升了索引和搜索的性能。 4...

    lucene3.0资料包

    **正文** Lucene是一个开源全文检索库,由Apache软件基金会开发。它提供了强大的文本分析、索引和搜索功能,广泛应用于各种信息检索系统...通过深入学习和应用Lucene3.0,开发者可以构建出高效、智能的信息检索系统。

    lucene3.0 实例

    在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索需求。在这个实例中,我们将探讨如何在 JDK 1.5 和 Lucene 3.0 的环境下构建和运行一个简单的搜索引擎。 ...

    lucene3.0庖丁+索引搜索程序

    《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene...通过深入学习其内部工作原理,结合具体的代码实践,开发者可以更好地利用Lucene3.0解决各种信息检索问题。

    lucene3.0使用介绍及实例

    **正文** Lucene是一个强大的全文检索库,由Apache软件基金会开发并维护,广泛应用于各种搜索引擎...通过学习和实践,开发者可以利用Lucene 3.0的强大功能,构建出高效、灵活的全文搜索引擎,满足各种应用场景的需求。

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。...通过学习和实践这个入门实例,你将能够掌握 Lucene 3.0 的基本操作,并为你的项目添加高效的全文检索功能。

    与lucene3.0兼容的庖丁jar包

    lucene升级了,分词也得升级哦! 在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z ...

    Lucene3.0分词系统.doc

    Lucene3.0分词系统的核心在于理解和应用其分词原理,无论是对于英文还是中文文本,这一过程都是构建高效搜索引擎的基础。以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

Global site tag (gtag.js) - Google Analytics