尝试中,更新中。。
本文基于hadoop1.0和lucene4.4
/**
* @param indexFiles 需要索引的文件
* @throws Exception
*/
public void doIndex(String indexFiles) throws Exception {
BufferedReader filereader = getBR(FILE.HDF,indexFiles); //获取文件的buffer流
if(filereader ==null ) return ;
String row = null;
while ((row = filereader.readLine()) != null) {
Document document = genDoc(row); //每行对应生产一个document,自定义
indexWriter.addDocument(document); //添加入IndexWriter
}
indexWriter.optimize(); //索引优化
indexWriter.close(); //写入
filereader.close();
}
private BufferedReader getBR(FILE where,String indexFiles) throws IOException {
switch (where)
{
case LOCAL: { //本地文件读取
return new BufferedReader(new FileReader(indexFiles));
}
case HDF: {//hdf文件获取
FileSystem dfs = FileSystem.get(config); //FileSystem获取,需要获取hadoop的configuration配置信息,其中主要的是期望获取hdfs空间的地址
FSDataInputStream fsin = dfs.open(new Path(indexFiles));
return new BufferedReader(new InputStreamReader(fsin, "UTF-8")); //FSDataInputStream 是InputStream的继承类
}
default:
break;
}
return null;
}
public String doSearch(String searchField) throws Exception {
if(searcher==null) {
System.out.println("start search...");
searcher = new IndexSearcher(rdir); //注意了,rdir是RAMDirectory噢,并且是当前jvm中建好索引的那个RAMDirectory 哟~~
System.out.println("Total Documents = " + searcher.maxDoc()); //查看已经建立好的document数量
}
if(queryParser==null) queryParser = new QueryParser(Version.LUCENE_30, Field,
new StandardAnalyzer(Version.LUCENE_30)); //Field用于自定义,指定你要查询的那个字段
Query query = queryParser.parse(searchField); //查询给定的值
TopDocs hits = searcher.search(query, n); //开始查询,n用于自定义,表示你期望查询的结果的条数
System.out.println("Number of matching documents = " + hits.totalHits); //输出实际查询到的条数
for(int i = 0; i<hits.totalHits;i++)
ScoreDoc sdoc = hits.scoreDocs[i]; //获取结果集
Document doc = searcher.doc(sdoc.doc); //获取对应的doc文件,如果需要的话
handle(doc) ; //自定义,处理查询出来的document
}
}