lucene--关键字查找

来源:互联网 发布:短信拦截软件 编辑:程序博客网 时间:2024/04/20 04:22

lucene的搜索功能能够提供多关键字,多条件等等的查询,下面的示例代码主要是给出了关键字在多个域的查询。另外lucene的hightlighter包(该包需要另外下载)还提供了一个高亮关键字的功能。在示例代码中也给出了高亮关键字的例子。

 

 示例代码:

  1.    
  2. //DocDetailBean是存放文件信息的bean  
  3.   
  4. public ArrayList<DocDetailBean> search(String keyword) throws Exception {  
  5.         ArrayList<DocDetailBean> list = new ArrayList<DocDetailBean>();  
  6.   
  7.         //获取索引路径  
  8.         Directory directory = FSDirectory.getDirectory(indexPath);  
  9.         //词义分析器  
  10.         Analyzer analyzer = new StandardAnalyzer();  
  11.         //搜索器  
  12.         IndexSearcher searcher = new IndexSearcher(directory);  
  13.         //对关键字分词  
  14.         final String[] field_list = {"content""fileName"};  
  15.         if (keyword == null) {  
  16.             return list;  
  17.         }  
  18.         QueryParser multi_parser = new MultiFieldQueryParser(field_list, analyzer);//多域分词  
  19.         Query query = multi_parser.parse(keyword);  
  20.        //单域分词  
  21.        //        Query query = new QueryParser("content", analyzer).parse(toKeyWord(keyWords));  
  22.         TopDocCollector collector = new TopDocCollector(1000); //1000表示命中的最条条数是1000条  
  23.         searcher.search(query, collector);  
  24.         ScoreDoc[] hits = collector.topDocs().scoreDocs;   //获得选中结果  
  25.   
  26.         //高亮关键字  
  27.         SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<strong><font color='red'>""</font></strong>");  
  28.         Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));  
  29.         highlighter.setTextFragmenter(new SimpleFragmenter(200));  
  30.   
  31.         //搜索出结果,并封装到bean中,  
  32.         for (int i = 0; i < hits.length; ++i) {  
  33.             //找到这个Document原来的索引值  
  34.             int docId = hits[i].doc;  
  35.             Document d = searcher.doc(docId);  //查找原文档  
  36.             String text = d.get("content");  
  37.             TokenStream tokenStream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), docId, "content", analyzer);  
  38.             TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, text, false200);  
  39.             String brief = "";  
  40.             for (int j = 0; j < frag.length; j++) {  
  41.                 if ((frag[j] != null && (frag[j].getScore() > 0))) {  
  42.                     brief += frag[j].toString();  
  43.                 }  
  44.             }  
  45.             DocDetailBean ddb = new DocDetailBean();  
  46.             ddb.setID(docId);  
  47.             ddb.setFileName(d.getField("fileName").stringValue());  
  48.             ddb.setPath(d.getField("path").stringValue());  
  49.             ddb.setBrief(brief);  
  50.             list.add(ddb);  
  51.             if (i > 98) {  
  52.                 break;  
  53.             }  
  54.         }  
  55.         searcher.close();  
  56.         // if(list.size()>200) return (ArrayList<DocDetailBean>) list.subList(0, 199);  
  57.         return list;  
  58.     }  

 

 

对于搜索方面,参考资料中的文章做了比较好的总结,可以点击链接查看。

参考资料:《Lucene2.4入门总结》   http://idealab.javaeye.com/blog/365869