lucene+heritrix day1

shibenjie 2008-04-03 03:48:30
package ear.lucenedemo.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

import jeasy.analysis.MMAnalyzer;

/**
*
* @author smileWater
* function 为要搜索的文件创建一个索引文件
* 通常使用lucene的步骤如下:
*1.为要处理的内容建立索引(有时可能在建立索引以前,要对文档做一些预处理工作)
*2.构建查询的对象
*3.利用查询对象在索引中查找
*/
public class IndexProcesser {
//成员变量,存储创建的索引文件要存放的位置
private String INDEX_STORE_PATH="d:\\lucene\\luceneIndex";
public static void main(String[] args){
IndexProcesser indexProcessor=new IndexProcesser();
long startTime=System.currentTimeMillis();
indexProcessor.createIndex("d:\\lucene\\luceneData\\");
long endTime=System.currentTimeMillis();
System.out.println("The time for create index is "+(endTime-startTime)+" ms.");
}
//创建索引
/*
* inputDir:要索引的文件存放的位置
*/
public void createIndex(String inputDir){
try {
//以MMAnalyzer作为分词工具创建一个IndexWriter
IndexWriter writer=new IndexWriter(INDEX_STORE_PATH,new MMAnalyzer(),true);
File filesDir=new File(inputDir);

//取得所有需要建立文件索引的文件数组
File[] files=filesDir.listFiles();

//遍历数组
for(int i=0;i<files.length;i++){
//获取文件名
String fileName=files[i].getName();
//判断是否是txt类型的文件
if(fileName.substring(fileName.lastIndexOf(".")).equals(".txt")){
//创建一个Document
Document doc=new Document();

//为文名字创建一个域field
//Field.Store.YES表示该Field需要存储
//Field.Store.NO 表示该Field不需要存储
//Field.Index.No表示该Field不需要被索引,也就是用户不需要查找该Field的值
//Field.Index.TOKENIZED表示该Field先 被分词在索引
//Field.Index.UN_TOKENIZED表示不对该Field分词,但是要对他进行索引
Field field=new Field("filename",files[i].getName(),Field.Store.YES,
Field.Index.TOKENIZED);
doc.add(field);

//为文件内容创建一个域field
field=new Field("content",loadFileToString(files[i]),Field.Store.NO,
Field.Index.TOKENIZED);

doc.add(field);
writer.addDocument(doc);
}
}
//关闭IndexWriter,一定要关闭索引
//如果没有关闭就会发现索引目录内除了segments文件外一无所有
writer.close();


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String loadFileToString(File file){
try {
BufferedReader br=new BufferedReader(new FileReader(file));
StringBuffer sb=new StringBuffer();
String line=br.readLine();
while(line!=null){
sb.append(line);
line=br.readLine();
}
br.close();
return sb.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}



package ear.lucenedemo.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

/**
*
* @author ffshi
* function:针对建立好的索引提供搜索的类
*/
public class Search {
// 全局变量,索引所处的路径
private String INDEX_STORE_PATH="d:\\lucene\\luceneIndex";

public static void main(String args[]){
Search search=new Search();
search.indexSearch("content","那个");
System.out.println("***************************************************************");
search.StringSearch("那个", "d:\\lucene\\luceneData");
}

//利用lucene API进行搜索
public void indexSearch(String searchType,String searchKey){
try {
//根据索引路径建立IndexSearcher
IndexSearcher searcher=new IndexSearcher(INDEX_STORE_PATH);

//建立搜索单元,searchType代表搜索的Field,searchKey代表关键字
Term t=new Term(searchType,searchKey);

//有Term生成一个Query
Query q=new TermQuery(t);

long startTime=System.currentTimeMillis();
//获取一个<document,frequency>的枚举对象TermDocs
TermDocs termDocs=searcher.getIndexReader().termDocs(t);
while(termDocs.next()){
//输出文档中出现关键词的次数
System.out.println(termDocs.freq());

//输出搜索到关键词的文档
System.out.println(searcher.getIndexReader().document(termDocs.doc()));
}
long endTime=System.currentTimeMillis();

long timeOfSearch=endTime-startTime;
System.out.println("The time for index search is "+timeOfSearch+" ms");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


//不用lucene进行的搜索,也就是不创建索引进行搜索,直接用String自带的匹配功能
// 可以看一下搜索用时 pk 一下lucene
/**
* keyword:要搜索的关键字
* searchDir:要搜索的范围,即是指定在那个目录下进行搜索
*/
public void StringSearch(String keyword,String searchDir){
File fileDir=new File(searchDir);
//返回该文件夹下面的所有文件数组
File[] files=fileDir.listFiles();

//用HashMap保存文件名和匹配次数对
Map rs=new HashMap();

long startTime=System.currentTimeMillis();

//开始遍历所有文件
for(int i=0;i<files.length;i++){
//初始化匹配次数
int hits=0;
try {
BufferedReader br=new BufferedReader(new FileReader(files[i]));
StringBuffer sb=new StringBuffer();
String line=br.readLine();
while(line!=null){
sb.append(line);
line=br.readLine();

}
br.close();
String stringToSearch=sb.toString();

//初始化fromIndex
int fromIndex=-keyword.length();
//逐个匹配这个关键词
while((fromIndex=stringToSearch.indexOf(keyword,fromIndex+keyword.length()))
!=-1){
hits++;
}
//将文件名字和匹配次数加入HashMap
rs.put(files[i].getName(), new Integer(hits));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
//输出查询结果
Iterator it=rs.keySet().iterator();
while(it.hasNext()){
String fileName=(String)it.next();
Integer hits=(Integer)rs.get(fileName);
System.out.println("find "+hits.intValue()+" matches in "+fileName);

}
long endTime=System.currentTimeMillis();
long timeOfSearch=endTime-startTime;
System.out.println("The time for String search is : "+timeOfSearch+" ms.");
}

}

...全文
71 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shibenjie 2009-07-16
  • 打赏
  • 举报
回复
4 30

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧