<pre name="code" class="java">package com.cn.zsj.lucene;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
/*
* 特别强调,本篇文章与总结一构建索引文件密切相关,请参考本人博客的lucene总结一
* 这里用到的包有
* lucene-analyzers-common-5.3.0.jar
* lucene-core-5.3.0.jar
* lucene-queryparser-5.3.0.jar
*
*/
public class TestSearch {
private static IndexSearcher searcher=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
TestSearch.getResult();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 第一步
* 利用IndexSearcher,QueryParser,Query,TopDocs构造要检索的的关键字,从而得出结果集TopDocs
*/
public static TopDocs getHits() throws IOException, ParseException{
Path indexPath=Paths.get("f:\\indexPath");//根据索引文件所在文件系统的uri建立Path对象
Directory dir=FSDirectory.open(indexPath);//根据索引路径构建Directory对象
IndexReader reader=DirectoryReader.open(dir);//根据索引目录构建IndexReader对象
searcher=new IndexSearcher(reader);//调用构造方法,创建IndexReader对象,还有很多重载的构造方法,自己看API了解
Analyzer analyzer=new StandardAnalyzer();
QueryParser parser=new QueryParser("content",analyzer);//第一个String参数是要查询的Document中Field字段的键名,不知道content指代什么的请回看lucene总结一
Query query=parser.parse("老百姓");//这里是指明要查询的关键字
TopDocs hits=searcher.search(query, 10);//调用IndexSearcher的search()方法,第二个参数是要查询的结果集条数,跟ResultSet差不多的意思
return hits;
}
/*
* 第二步
* 遍历结果集,检索用户输入的关键字对应的搜索结果
*/
public static void getResult() throws IOException, ParseException{
TopDocs hits=TestSearch.getHits();//获取结果集,这其实是个文档的集合
//此时我们可以简单的TopDocs中totalHits字段测试根据输入的关键字是否有对应的结果,
int hitsLength=hits.totalHits;
Document doc=null;
System.out.println(hitsLength);//输入结果集中的结果数
for(int i=0;i<hitsLength;i++){
doc=searcher.doc(hits.scoreDocs[i].doc);//调用IndexSearcher的doc()方法,参数是文档编号,获取结果集中的文档
System.out.println("查询关键字'老百姓'返回的文档名字为"+doc.get("filename"));//这里的get()参数为|Field字段的键名,在总结一中可以看到我在Document对象中添加了filename字段
}
}
}
看看运行结果如何: