你好,游客 登录 注册 搜索
背景:
阅读新闻

初识Lucene 4.5全文搜索

[日期:2014-07-22] 来源:Linux社区  作者:linhongyu [字体: ]

那接下来我们可以写个测试方法看看效果,至于luceneBeans的数据我就不贴出来了,大家可以自己导入,我们不仅可以用javaBean的数据来创建索引,像txt、pdf、ini等文件的数据也是可以导入来创建索引的;

如果你创建成功了则在对应的index文件夹下会多出这些文件:

初识Lucene 4.5全文搜索

创建好索引后,当然我们要开始检索索引咯,重要的是获得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 4.5全文搜索

嗯~夜已深,先分享到这边。之后陆续还会再分享关于lucene的相关博文,希望对您有所帮助。初出茅如,若文中有错误之处还望包涵指正。喜欢交流、喜欢分享~

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-07/104532.htm

linux
相关资讯       Lucene  Lucene 4.5  Lucene全文搜索 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款