那接下来我们可以写个测试方法看看效果,至于luceneBeans的数据我就不贴出来了,大家可以自己导入,我们不仅可以用javaBean的数据来创建索引,像txt、pdf、ini等文件的数据也是可以导入来创建索引的;
如果你创建成功了则在对应的index文件夹下会多出这些文件:
创建好索引后,当然我们要开始检索索引咯,重要的是获得indexReader,然后创建indexSearch去检索。我知识举个最常规的用法,其中还有很多东西还需个人去体会。(接上面代码写在IndexUtil类内)
/**
* 创建IndexReader
* 为保证检索时,索引的同步更新,需对reader进行判断
* @return
*/
public static IndexSearcher getIndexSearcher(){
try {
//判断reader是否为空
if(reader==null){
reader = DirectoryReader.open(directory);
}else{
//3.x版本是用IndexReader.openIfChange(reader);来判断reader是否有改变。
//reader有改变则返回改变后的;若无改变则返回null
IndexReader ir = DirectoryReader.openIfChanged((DirectoryReader)reader);
if(ir!=null){
//reader已改变则关闭原先的,再将改变后的赋值给reader
reader.close();
reader = ir;
}
}
return new IndexSearcher(reader);
} catch (IOException e) {
e.printStackTrace();
return null;
}
/**
* 从索引中检索
* @param content
* @return
*/
public List<LuceneBeans> searchIndex(String content){
List<LuceneBeans> list = new ArrayList<LuceneBeans>();
try {
System.out.println("文档数numDocs:"+reader.numDocs());
System.out.println("文档总数maxDocs:"+reader.maxDoc());
System.out.println("删除数deleteDocs:"+reader.numDeletedDocs());
IndexSearcher searcher = IndexUtil.getIndexSearcher();
//使用查询解析器创建Query(Version.LUCENE_45对应版本号,“introduce”默认索引域)
//new StandardAnalyzer(Version.LUCENE_45))标准分词器
//Query的方法还有很多种,例如TermQuery精确查询、PrefixQuery前缀查询、WildcardQuery通配符查询……等
QueryParser questParser = new QueryParser(Version.LUCENE_45,"introduce",
new StandardAnalyzer(Version.LUCENE_45));
Query query = null;
try {
query = questParser.parse(content);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("查询语句:"+query.toString());
long begin = new Date().getTime();
TopDocs topDocs = searcher.search(query, 15);//15为检索出的个数
if(topDocs!=null){
ScoreDoc[] scoreDoc = topDocs.scoreDocs;
System.out.println("共搜索到("+topDocs.totalHits+")条匹配结果");
for(ScoreDoc sd : scoreDoc){
Document doc = searcher.doc(sd.doc);
System.out.println("标题:"+doc.get("title")+" 评分score:"+sd.score);
LuceneBeans lb = new LuceneBeans();
lb.setId(doc.get("id"));
lb.setTitle(doc.get("title"));
lb.setIntroduce(doc.get("introduce"));
lb.setAddtime(doc.get("addtime"));
lb.setCategory(doc.get("category"));
list.add(lb);
}
}
long end = new Date().getTime();
System.out.println("搜索完毕... ... 共用时:" + (end - begin) +"毫秒...");
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
具体的每个方法和属性,就不一一讲解,毕竟挺别人说不一定全对,还是去查看官方文档更为准确。写个测试方法看看上面那段代码:
@Test
public void search(){
IndexUtil lu = new IndexUtil();
List<LuceneBeans> list = lu.searchIndex("小王子");
if(list!=null&&list.size()>0){
System.out.println("检索到的结果数据:");
for(LuceneBeans lb:list){
System.out.println("===================================");
System.out.println("id:"+lb.getId()+"===title:"+lb.getTitle());
}
}
}
嗯~夜已深,先分享到这边。之后陆续还会再分享关于lucene的相关博文,希望对您有所帮助。初出茅如,若文中有错误之处还望包涵指正。喜欢交流、喜欢分享~
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-07/104532.htm