zoukankan      html  css  js  c++  java
  • 保存信息时调用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();   
            }
        }
    }
  • 相关阅读:
    【转载】 C#中使用Sum方法对List集合进行求和操作
    【转载】 C#中使用Count方法获取List集合中符合条件的个数
    【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体
    【转载】Windows检测到IP地址冲突
    【转载】Asp.Net MVC网站提交富文本HTML标签内容抛出异常
    java笔试题(4)
    Android -- TouchEvent的分发和截获方式
    SQL优化
    Android -- 经验分享(二)
    设计模式(十二)外观模式(结构型)
  • 原文地址:https://www.cnblogs.com/lcuzhanglei/p/2616710.html
Copyright © 2011-2022 走看看