保存信息时调用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);">&nbsp;<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();   
        }
    }
}

 

posted @ 2012-07-31 13:41  lcuzhanglei  阅读(237)  评论(0编辑  收藏  举报