保存信息时调用luceneDao中的save方法产生索引,搜索时调用search依据进行查询
@Repository("luceneDao") public class LuceneDao { /** * * save: 产生索引 * 由于在通过IndexWriter对象操作索引库的时候,忘记关闭该对象流了。 * 当关闭时,程序退出自会上索引锁,所以在用IndexWriter进行 * 索引库操作的时候一定要记得关闭该对象流! * @param @param message 设定文件 * @return void DOM对象 * @throws * @since search1.0 */ public void save(Message message) { IndexWriter indexWriter = null; try { indexWriter = SearchUtils.getIndexWriter(); indexWriter.addDocument(SearchUtils.parseMessageToDocument(message)); indexWriter.setMergeFactor(4); indexWriter.optimize(); indexWriter.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ if(null != indexWriter){ try { indexWriter.close(); } catch (Exception e) { e.printStackTrace(); } } } } /** * * search:查询 * * @param @param query * @param @return 设定文件 * @return List<MessageBean> DOM对象 * @throws * @since search1.0 */ public List<MessageBean> search(String query) { List<MessageBean> messageBeans = new ArrayList<MessageBean>(); IndexSearcher indexSearcher = SearchUtils.getIndexSearch(); String[] fields = {"title", "content"}; MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, SearchUtils.analyzer); try { Query luceneQuery = queryParser.parse(query); TopDocs topDocs = indexSearcher.search(luceneQuery, 100); ScoreDoc[] scoreDocs = topDocs.scoreDocs; Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>"); QueryScorer scorer = new QueryScorer(luceneQuery); Highlighter highlighter = new Highlighter(formatter, scorer); Fragmenter fragmenter = new SimpleFragmenter(20); highlighter.setTextFragmenter(fragmenter); for(ScoreDoc scoreDoc : scoreDocs){ Document doc = indexSearcher.doc(scoreDoc.doc); String title = highlighter.getBestFragment(SearchUtils.analyzer, "title", doc.get("title")); String content = highlighter.getBestFragment(SearchUtils.analyzer, "content", doc.get("content")); if( null != title){ doc.getField("title").setValue(title); } if( null != content){ doc.getField("content").setValue(content); } messageBeans.add(SearchUtils.parseDocumentToMessageBean(doc)); } } catch (Exception e) { e.printStackTrace(); }finally{ if(null != indexSearcher){ try { indexSearcher.close(); } catch (IOException e) { e.printStackTrace(); } } } return messageBeans; } }
<span style="white-space: normal; background-color: rgb(255, 255, 255);"> <span style="white-space: pre; background-color: rgb(250, 250, 250);">public class SearchUtils {</span></span> public static IKAnalyzer analyzer; public static Directory directory; static { File file = new File("./indexs/"); try { directory = FSDirectory.open(file); analyzer = new IKAnalyzer(); } catch (IOException e) { e.printStackTrace(); } } /** * * getIndexWriter:return indexwriter * * @param @return 设定文件 * @return IndexWriter DOM对象 * @throws * @since search1.0 */ public static IndexWriter getIndexWriter(){ IndexWriter indexWriter = null; try { //字段设置为有限长度 indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED); //indexWriter.setMaxFieldLength(100);设置最大长度 } catch (Exception e) { e.printStackTrace(); } return indexWriter; } /** * * getIndexSearch:return indexsearcher * * @param @return 设定文件 * @return IndexSearcher DOM对象 * @throws * @since search1.0 */ public static IndexSearcher getIndexSearch(){ IndexSearcher indexSearcher = null; try { indexSearcher = new IndexSearcher(directory); } catch (Exception e) { e.printStackTrace(); } return indexSearcher; } public static IndexReader getIndexReader(){ IndexReader reader = null; try { reader = IndexReader.open(directory); } catch (Exception e) { e.printStackTrace(); } return reader; } /** * * parseToObject:from document to Object * * @param @param document * @param @return 设定文件 * @return Lucene DOM对象 * @throws * @since search1.0 */ public static Lucene parseToObject(Document document) { Lucene lucene = new Lucene(); lucene.setTitle(document.get("title")); lucene.setUrl(document.get("url")); lucene.setDigest(document.get("digest")); return lucene; } /** * * parseMessageToDocument:parse message to document * * @param @param message * @param @return 设定文件 * @return Document DOM对象 * @throws * @since search1.0 */ public static Document parseMessageToDocument(Message message){ Document doc = new Document(); doc.add(new Field("id", message.getId(), Store.YES, Index.NOT_ANALYZED)); doc.add(new Field("title", message.getTitle(), Store.YES, Index.ANALYZED)); doc.add(new Field("author", message.getAuthor(), Store.YES, Index.ANALYZED)); doc.add(new Field("keywords", message.getKeywords(), Store.YES, Index.ANALYZED)); doc.add(new Field("content", message.getContent(), Store.YES, Index.ANALYZED)); return doc; } /** * * parseDocumentToMessageBean:parse document to message * * @param @param doc * @param @return 设定文件 * @return MessageBean DOM对象 * @throws * @since search1.0 */ public static MessageBean parseDocumentToMessageBean(Document doc){ MessageBean messageBean = new MessageBean(); messageBean.setId(doc.get("id")); messageBean.setTitle(doc.get("title")); messageBean.setAuthor(doc.get("author")); messageBean.setKeywords(doc.get("keywords")); messageBean.setContent(doc.get("content")); return messageBean; } /** * * unLock:unlock * * @param 设定文件 * @return void DOM对象 * @throws * @since search1.0 */ public static void unLock(){ try { if (IndexWriter.isLocked(directory)) { IndexWriter.unlock(directory); } } catch (IOException e) { e.printStackTrace(); } } }