nap积分130:研究Lucence(Java全文搜索引擎工具包)有感

来源:百度文库 编辑:中财网 时间:2024/04/30 16:44:53

Lucence是Java全文搜索引擎工具包,可以提供站内全文搜索,当前是否能做成像百度一样的搜索引擎,我就不知道了

首先来看看示例,先找个感觉

http://www.cdfast.cn/

这是本人近期完成的一个购物商城的项目,顶上的搜索就是用的Lucence实现全文搜索,当前这个网站暂时还未完全启用,处于测试阶段,所有商品信息都是胡编乱造的,如有雷同,不胜荣幸

例如:输入“CCD” 或者 “CCD 彩色 防水” 试试 ^_^

 

我认为,Lucence其实就是在系统中创建了一个查询索引,你可以理解为一个磁盘文件,然后将查询时需要的信息以某种方式保存的里面,然后当用户执行查询时,直接在这个磁盘文件中查找,并将结果显示出来。

当然这是我的理解,不对之处,请批评

接下来就是实际代码

1.首先导入jar包(自己想办法下载,百度一下即可)

lucene-core-3.0.2.jar
IKAnalyzer3.2.3Stable.jar

 

2.创建索引,以下代码是在struts2 + spring中使用的查询,只看我的思路,光看代码无意义

Java代码  

  1. IndexWriter indexWriter = null;   
  2. ServletContext context = (ServletContext) ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);   
  3. String indexUrl = context.getRealPath("/lucence/index");   
  4. File lucenceDir = new File(indexUrl);   
  5. // 如果存在直接读取,如果没有就创建   
  6. if (lucenceDir.exists()) {   
  7.     indexWriter = new IndexWriter(FSDirectory.open(lucenceDir), new IKAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED);   
  8. else {   
  9.     indexWriter = new IndexWriter(FSDirectory.open(lucenceDir),new IKAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);   
  10. }  

 

 

3.将数据库中的信息按我需要的形式添加到索引中去

Java代码  
  1. Document doc = new Document();   
  2. String brandName = "";//取得品牌信息   
  3. String typeName = "";//取得类别信息   
  4.   
  5. //拼接总介绍信息,将商品描述的前200个字截取出来   
  6. String summary = brandName   
  7.                 + " "  
  8.                 + typeName   
  9.                 + " "  
  10.                 + WebUtil.splitAndFilterString(product.getProductDescription(),200);   
  11. // 拼接检索内容,包含商品名称,类别名称,品牌名称,关键字,简单描述,详细描述   
  12. StringBuffer content = new StringBuffer();   
  13. content.append(product.getProductProName());   
  14. content.append(" " + brandName);   
  15. content.append(" " + typeName);   
  16. content.append(" " + product.getProductKeywords());   
  17. content.append(" " + product.getProductSimpleDescription());   
  18. content.append(" " + WebUtil.filterString(product.getProductDescription()));   
  19. doc.add(new Field("uid", product.getProductId().toString(),Field.Store.YES, Field.Index.ANALYZED));   
  20. doc.add(new Field("title", product.getProductProName(),Field.Store.YES, Field.Index.NOT_ANALYZED));   
  21. doc.add(new Field("summary", summary, Field.Store.YES,Field.Index.NOT_ANALYZED));   
  22. doc.add(new Field("contents", content.toString(), Field.Store.YES,Field.Index.ANALYZED));   
  23. doc.add(new Field("modifyTime"new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), Field.Store.YES,   
  24. Field.Index.NOT_ANALYZED));  

 

4.最后添加到索引中

Java代码  
  1. indexWriter.addDocument(doc);//将文档添加到索引中   
  2. indexWriter.optimize();//优化索引  

 

5.查询索引中的信息

Java代码  
  1. ServletContext context = (ServletContext) ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);   
  2. IndexReader reader = IndexReader.open(FSDirectory.open(new File(context.getRealPath("/lucence/index"))), true);   
  3. IndexSearcher searcher = new IndexSearcher(reader);   
  4. // 在索引器中使用IKSimilarity相似度评估器   
  5. searcher.setSimilarity(new IKSimilarity());   
  6. // 使用IKQueryParser查询分析器构造Query对象   
  7. queryString = new String(queryString.getBytes("ISO-8859-1"),"UTF-8");   
  8. Query query = IKQueryParser.parse("contents", queryString);   
  9. TopDocs hits = searcher.search(query, curPage * 20);   
  10. if (hits.totalHits > 0) {   
  11.     int offset = (curPage - 1) * 20;   
  12.     int maxLength = 0;   
  13.     if (hits.totalHits - offset > 20) {   
  14.         maxLength = 20;   
  15.         maxPage = 0;   
  16.     } else {   
  17.         maxLength = hits.totalHits - offset;   
  18.         maxPage = 1;// 设置最后一页标志   
  19.     }   
  20.   
  21.     for (int i = offset; i < offset + maxLength; i++) {   
  22.         SearchBean bean = new SearchBean();   
  23.         Document doc = searcher.doc(hits.scoreDocs[i].doc);   
  24.         bean.setUid(doc.get("uid"));   
  25.         bean.setTitle(doc.get("title"));   
  26.         bean.setSummary(doc.get("summary"));   
  27.         bean.setModifyTime(doc.get("modifyTime"));   
  28.         // 为title添加链接   
  29.         bean.setTitle(""'>" + bean.getTitle().trim() + "");   
  30.         // 将关键字进行着色   
  31.         queryString = queryString.trim();   
  32.         String[] keys = queryString.split(" ");   
  33.         if (keys != null && keys.length > 0) {   
  34.             for (String curKey : keys) {   
  35.                 bean.setTitle(bean.getTitle().replaceAll(curKey,"" + curKey + ""));   
  36.                 bean.setSummary(bean.getSummary().replace(curKey,"" + curKey + ""));   
  37.             }   
  38.         } else {   
  39.             bean.setTitle(bean.getTitle().replaceAll(queryString,"" + queryString + ""));   
  40.             bean.setSummary(bean.getSummary().replace(queryString, "" + queryString + ""));   
  41.         }   
  42.         searchList.add(bean);   
  43.     }   
  44. else {   
  45.     searchList = null;   
  46. }