Java博客系统

来源:互联网 发布:vs是什么意思网络用语 编辑:程序博客网 时间:2024/05/11 05:55
下面图片是主页的截图 


 


下面图片是日志模块的截图 



 




下图是留言模块的截图(留言模块利用到struts2+json+jquery实现ajax异步技术实现


 


下图是图片显示的截图模块( 主页是利用thickbox实现浏览相片功能,和利用纯js实现防百度的相册和ajax评论

 

防百度显示相册功能: 

 


下图是音乐播放模块(这个模块主要防网易的音乐播放模块) 


 


音乐播放是调用网易的音乐播放器 


 


下图是利用lucene搜索日志高亮显示模块(主要是利用lucene技术进行实现的高亮显示和搜索) 


文章显示模块:(相关文章提示主要是利用lucene对题目进行分词,在进行对索引进行查询) 


 


程序下载模块:(这个模块主要是上传项目供用户下载) 

 





后台模块 
登陆界面: 

 

日志添加:(主要利用fckeditor编辑器实现) 

 
就贴这么多了! 

代码总体结构如下. 

 


 


贴上部分代码:(lucene索引的建立和查询) 
Java代码  收藏代码
  1. package cn.ljzblog.ljz.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7. import jeasy.analysis.MMAnalyzer;  
  8. import org.apache.lucene.analysis.Analyzer;  
  9. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  10. import org.apache.lucene.document.Document;  
  11. import org.apache.lucene.document.Field;  
  12. import org.apache.lucene.index.CorruptIndexException;  
  13. import org.apache.lucene.index.IndexReader;  
  14. import org.apache.lucene.index.IndexWriter;  
  15. import org.apache.lucene.index.Term;  
  16. import org.apache.lucene.queryParser.ParseException;  
  17. import org.apache.lucene.queryParser.QueryParser;  
  18. import org.apache.lucene.search.BooleanClause;  
  19. import org.apache.lucene.search.BooleanQuery;  
  20. import org.apache.lucene.search.Hits;  
  21. import org.apache.lucene.search.IndexSearcher;  
  22. import org.apache.lucene.search.Query;  
  23. import org.apache.lucene.search.ScoreDoc;  
  24. import org.apache.lucene.search.TermQuery;  
  25. import org.apache.lucene.search.TopDocs;  
  26. import org.apache.lucene.search.highlight.Fragmenter;  
  27. import org.apache.lucene.search.highlight.Highlighter;  
  28. import org.apache.lucene.search.highlight.QueryScorer;  
  29. import org.apache.lucene.search.highlight.SimpleFragmenter;  
  30. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;  
  31. import org.apache.lucene.store.Directory;  
  32. import org.apache.lucene.store.FSDirectory;  
  33. import org.apache.lucene.store.LockObtainFailedException;  
  34. import test.LuceneJEAnalyzerText;  
  35. import cn.ljzblog.ljz.model.Article;  
  36. import cn.ljzblog.ljz.model.LogQueryTemp;  
  37. import cn.ljzblog.ljz.model.PicQueryTemp;  
  38.   
  39. /** 
  40.  * @theme 主要是封装lucene索引和查询索引的方法 
  41.  * @author ljz 
  42.  * @since 2010/10/10 
  43.  */  
  44. public class LuceneQuery {  
  45.     private static String indexPath;// 索引生成的目录  
  46.     private static IndexWriter indexWriter;//  
  47.     private IndexSearcher searcher;  
  48.     private Directory dir;  
  49.     private String prefixHTML = "<font color='red'>";  
  50.     private String suffixHTML = "</font>";  
  51.     private Date date;  
  52.     private Date date2;  
  53.   
  54.     public LuceneQuery(String indexPath) {  
  55.         date = new Date();  
  56.         this.indexPath = indexPath;  
  57.     }  
  58.   
  59.     /** 
  60.      * 函数功能:建立文章的索引 
  61.      * @param list 
  62.      */  
  63.     public void createIndex(List<Article> list) {  
  64.   
  65.         createIndexWriter();// 生成indexWriter对象  
  66.         for (Article article : list) {  
  67.             Document document = new Document();// 生成Document对象  
  68.             Field field = new Field("articleId", String.valueOf(article.getArticleId()), Field.Store.YES, Field.Index.NO);  
  69.             Field field2 = new Field("articleName", article.getArticleName(),Field.Store.YES, Field.Index.ANALYZED);  
  70.             Field field3 = new Field("articleContent", article.getArticleContent(), Field.Store.YES, Field.Index.NO);  
  71.             document.add(field);  
  72.             document.add(field2);  
  73.             document.add(field3);  
  74.             try {  
  75.                 indexWriter.addDocument(document);  
  76.             } catch (CorruptIndexException e) {  
  77.                 e.printStackTrace();  
  78.             } catch (IOException e) {  
  79.                 e.printStackTrace();  
  80.             }  
  81.         }  
  82.         closeIndexWriter(indexWriter);  
  83.     }  
  84.   
  85.     /** 
  86.      * 函数功能:建立对文章的高亮显示查询 
  87.      *  
  88.      */  
  89.     public void createHightLightIndex(List<LogQueryTemp> list) {  
  90.         createIndexWriter();// 生成indexWriter对象  
  91.         System.out.println("createHightLightIndex list length" + list.size());  
  92.         for (LogQueryTemp logQuery : list) {  
  93.             Document document = new Document();// 生成Document对象  
  94.             Field field = new Field("articleId", String.valueOf(logQuery.getArticleId()), Field.Store.YES, Field.Index.NO);  
  95.             Field field2 = new Field("articleName", logQuery.getArticleName(),Field.Store.YES, Field.Index.ANALYZED);  
  96.             Field field3 = new Field("articleKindName", logQuery.getArticleKindName(), Field.Store.YES, Field.Index.NO);  
  97.             Field field4 = new Field("writeTime", logQuery.getWriteTime(),Field.Store.YES, Field.Index.NO);  
  98.             Field field5 = new Field("articleContent", logQuery.getArticleContent(), Field.Store.YES, Field.Index.ANALYZED);  
  99.             document.add(field);  
  100.             document.add(field2);  
  101.             document.add(field3);  
  102.             document.add(field4);  
  103.             document.add(field5);  
  104.             try {  
  105.                 indexWriter.addDocument(document);  
  106.             } catch (CorruptIndexException e) {  
  107.                 e.printStackTrace();  
  108.             } catch (IOException e) {  
  109.                 e.printStackTrace();  
  110.             }  
  111.         }  
  112.         closeIndexWriter(indexWriter);  
  113.     }  
  114.   
  115.     /** 
  116.      * 函数功能:建立查询图片的索引(主要是对图片的描述建立索引) 
  117.      *  
  118.      */  
  119.     public void createPicIndex(List<PicQueryTemp> list) {  
  120.         createIndexWriter();// 生成indexWriter对象  
  121.         for (PicQueryTemp picQuery : list) {  
  122.             Document document = new Document();// 生成Document对象  
  123.             Field field = new Field("picId", String.valueOf(picQuery.getPicId()), Field.Store.YES,Field.Index.NO);  
  124.             Field field2 = new Field("picGroupId", String.valueOf(picQuery.getPicGroupId()), Field.Store.YES, Field.Index.NO);  
  125.             Field field3 = new Field("picName", picQuery.getPicName(),Field.Store.YES, Field.Index.NO);  
  126.             Field field4 = new Field("pictureDetail", picQuery.getPictureDetail(), Field.Store.YES, Field.Index.ANALYZED);  
  127.   
  128.             document.add(field);  
  129.             document.add(field2);  
  130.             document.add(field3);  
  131.             document.add(field4);  
  132.             try {  
  133.                 indexWriter.addDocument(document);  
  134.             } catch (CorruptIndexException e) {  
  135.                 e.printStackTrace();  
  136.             } catch (IOException e) {  
  137.                 e.printStackTrace();  
  138.             }  
  139.         }  
  140.         closeIndexWriter(indexWriter);  
  141.     }  
  142.   
  143.     /** 
  144.      * 函数功能 :关闭indexWriter 
  145.      *  
  146.      * @param indexWriter 
  147.      */  
  148.     public void closeIndexWriter(IndexWriter indexWriter) {  
  149.         try {  
  150.             indexWriter.optimize();  
  151.             indexWriter.close();  
  152.             date2 = new Date();  
  153.             System.out.println("建立索引总共用了:" + (date2.getTime() - date.getTime())  
  154.                     + "毫秒");  
  155.         } catch (CorruptIndexException e) {  
  156.             e.printStackTrace();  
  157.         } catch (IOException e) {  
  158.             e.printStackTrace();  
  159.         }  
  160.   
  161.     }  
  162.   
  163.     /** 
  164.      * 函数功能:生成indexWriter对象 
  165.      */  
  166.     public void createIndexWriter() {  
  167.         try {  
  168.             boolean flag = true;  
  169.             // 如果已存在索引,则追加索引  
  170.             if (IndexReader.indexExists(indexPath)) {  
  171.                 flag = false;  
  172.             }  
  173.   
  174.             indexWriter = new IndexWriter(indexPath, new StandardAnalyzer(),  
  175.                     flag, IndexWriter.MaxFieldLength.LIMITED);  
  176.         } catch (CorruptIndexException e) {  
  177.             e.printStackTrace();  
  178.         } catch (LockObtainFailedException e) {  
  179.             e.printStackTrace();  
  180.         } catch (IOException e) {  
  181.             e.printStackTrace();  
  182.         }  
  183.     }  
  184.   
  185.     /** 
  186.      * 函数功能:查询文章的索引 
  187.      */  
  188.     public List<Article> queryIndex(String indexPath, String findContent) {  
  189.         List<Article> list2 = new ArrayList<Article>();  
  190.         System.out.println("查询内容为:" + findContent);  
  191.         try {  
  192.             dir = FSDirectory.getDirectory(indexPath);  
  193.             searcher = new IndexSearcher(dir);  
  194.             QueryParser parser = new QueryParser("articleName",  
  195.                     new StandardAnalyzer());  
  196.             try {  
  197.                 Query query = parser.parse(findContent);// 根据查询内容进行查询  
  198.                 TopDocs topDocs = searcher.search(query, 5);  
  199.                 ScoreDoc[] hits = topDocs.scoreDocs;  
  200.                 for (int i = 0; i < hits.length; i++) {  
  201.                     int DocId = hits[i].doc;  
  202.                     Article article = new Article();  
  203.                     Document doc = searcher.doc(DocId);  
  204.   
  205.                     article.setArticleId(Integer.parseInt(doc.get("articleId")));  
  206.                     article.setArticleName(doc.get("articleName"));  
  207.                     article.setArticleContent(doc.get("articleContent"));  
  208.                     list2.add(article);  
  209.                 }  
  210.   
  211.                 Date date3 = new Date();  
  212.                 System.out.println("查询总共花的时间为:"+ (date3.getTime() - date2.getTime()) + "毫秒");  
  213.   
  214.             } catch (ParseException e) {  
  215.                 e.printStackTrace();  
  216.             }  
  217.   
  218.         } catch (IOException e) {  
  219.             e.printStackTrace();  
  220.         }  
  221.         return list2;  
  222.   
  223.     }  
  224.   
  225.     /** 
  226.      * 函数功能:通过booleanQuery方法进行查询索引 
  227.      */  
  228.     public List<Article> queryIndexByBooleanQuery(String indexPath,  
  229.             String findContent) {  
  230.         List<Article> list2 = new ArrayList<Article>();  
  231.         LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath);  
  232.         BooleanQuery booleanQuery = new BooleanQuery();  
  233.         try {  
  234.             dir = FSDirectory.getDirectory(indexPath);  
  235.             searcher = new IndexSearcher(dir);  
  236.             String[] str = jeAnalyzer.createAnalyzer(findContent).split(",");  
  237.             for (int i = 0; i < str.length; i++) {  
  238.                 booleanQuery.add(  
  239.                         new TermQuery(new Term("articleName", str[i])),  
  240.                         BooleanClause.Occur.SHOULD);  
  241.             }  
  242.   
  243.             // QueryParser parser = new QueryParser("articleName", new  
  244.             // StandardAnalyzer());  
  245.   
  246.             // Query query = parser.parse(findContent);//根据查询内容进行查询  
  247.             TopDocs topDocs = searcher.search(booleanQuery, 3);  
  248.             ScoreDoc[] hits = topDocs.scoreDocs;  
  249.             for (int i = 0; i < hits.length; i++) {  
  250.                 int DocId = hits[i].doc;  
  251.                 Article article = new Article();  
  252.                 Document doc = searcher.doc(DocId);  
  253.   
  254.                 article.setArticleId(Integer.parseInt(doc.get("articleId")));  
  255.                 article.setArticleName(doc.get("articleName"));  
  256.                 // article.setArticleContent(doc.get("articleContent"));  
  257.                 list2.add(article);  
  258.                 // list2.add(doc.get("sname"));  
  259.             }  
  260.             if (hits.length > 0) {  
  261.                 list2.remove(0);  
  262.             }  
  263.             Date date3 = new Date();  
  264.             System.out.println("查询总共花的时间为:"  
  265.                     + (date3.getTime() - date2.getTime()) + "毫秒");  
  266.   
  267.         } catch (IOException e) {  
  268.             e.printStackTrace();  
  269.         }  
  270.         return list2;  
  271.   
  272.     }  
  273.   
  274.   
  275.     /** 
  276.      * 函数功能:高亮显示查询 
  277.      *  
  278.      * @param fieldName 
  279.      * @param keyword 
  280.      * @throws CorruptIndexException 
  281.      * @throws IOException 
  282.      * @throws ParseException 
  283.      */  
  284.     public List<PicQueryTemp> queryPicByLucene(String findContent) {  
  285.         List<PicQueryTemp> list2 = new ArrayList<PicQueryTemp>();  
  286.         LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath);  
  287.         System.out.println("查询内容为:" + findContent);  
  288.         BooleanQuery booleanQuery = new BooleanQuery();  
  289.         try {  
  290.             dir = FSDirectory.getDirectory(indexPath);  
  291.             searcher = new IndexSearcher(dir);  
  292.             String[] str = jeAnalyzer.createAnalyzer(findContent).split(",");  
  293.             for (int i = 0; i < str.length; i++) {  
  294.                 booleanQuery.add(new TermQuery(  
  295.                         new Term("pictureDetail", str[i])),  
  296.                         BooleanClause.Occur.SHOULD);  
  297.             }  
  298.   
  299.             TopDocs topDocs = searcher.search(booleanQuery, 12);  
  300.             ScoreDoc[] hits = topDocs.scoreDocs;  
  301.             for (int i = 0; i < hits.length; i++) {  
  302.                 int DocId = hits[i].doc;  
  303.                 PicQueryTemp picQuery = new PicQueryTemp();  
  304.                 Document doc = searcher.doc(DocId);  
  305.                 picQuery.setPicGroupId(Integer.parseInt(doc.get("picGroupId")));  
  306.                 picQuery.setPicId(Integer.parseInt(doc.get("picId")));  
  307.                 picQuery.setPicName(doc.get("picName"));  
  308.                 picQuery.setPictureDetail(doc.get("pictureDetail"));  
  309.                 list2.add(picQuery);  
  310.                 // list2.add(doc.get("sname"));  
  311.             }  
  312.   
  313.             Date date3 = new Date();  
  314.             System.out.println("查询总共花的时间为:"  
  315.                     + (date3.getTime() - date2.getTime()) + "毫秒");  
  316.   
  317.         } catch (IOException e) {  
  318.             e.printStackTrace();  
  319.         }  
  320.         return list2;  
  321.   
  322.     }  
  323.   
  324.     /**函数功能:主要对文章的索引进行查询,主要是查询文章的内容和标题 
  325.      * @param keyword 
  326.      * @param startIndex 
  327.      * @param endIndex 
  328.      * @return 
  329.      * @throws CorruptIndexException 
  330.      * @throws IOException 
  331.      * @throws ParseException 
  332.      */  
  333.     public List<LogQueryTemp> search(String keyword, int startIndex,  
  334.             int endIndex) throws CorruptIndexException, IOException,  
  335.             ParseException {  
  336.         List<LogQueryTemp> listlog = new ArrayList<LogQueryTemp>();  
  337.   
  338.         searcher = new IndexSearcher(indexPath);  
  339.         Analyzer analyzer = new MMAnalyzer();  
  340.         // QueryParser queryParse = new QueryParser(fieldName, analyzer);  
  341.         // Query query = queryParse.parse(keyword);  
  342.   
  343.         LuceneJEAnalyzerText jeAnalyzer = new LuceneJEAnalyzerText(indexPath);  
  344.         BooleanQuery booleanQuery = new BooleanQuery();  
  345.         try {  
  346.             dir = FSDirectory.getDirectory(indexPath);  
  347.             searcher = new IndexSearcher(dir);  
  348.             String[] str = jeAnalyzer.createAnalyzer(keyword).split(",");  
  349.             for (int j = 0; j < str.length; j++) {  
  350.                 booleanQuery.add(new TermQuery(new Term("articleContent",str[j])), BooleanClause.Occur.SHOULD);  
  351.                 booleanQuery.add(new TermQuery(new Term("articleName", str[j])),BooleanClause.Occur.SHOULD);  
  352.   
  353.             }  
  354.   
  355.             Hits hits = searcher.search(booleanQuery);  
  356.             if (endIndex >= hits.length()) {  
  357.                 endIndex = hits.length() - 1;  
  358.             }  
  359.             for (int i = startIndex; i <= endIndex; i++) {  
  360.                 LogQueryTemp logQuery = new LogQueryTemp();  
  361.                 Document doc = hits.doc(i);  
  362.                 String text = doc.get("articleContent");  
  363.                 String text2 = doc.get("articleName");  
  364.                 int htmlLength = prefixHTML.length() + suffixHTML.length();  
  365.                 // System.out.println("高亮HTML的总长度为" + htmlLength);  
  366.                 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(  
  367.                         prefixHTML, suffixHTML);  
  368.                 Highlighter highlighter = new Highlighter(simpleHTMLFormatter,  
  369.                         new QueryScorer(booleanQuery));  
  370.                 // 设置被高亮的文本返回的摘要的文本大小  
  371.                 Fragmenter fragmenter = new SimpleFragmenter(350);// 默认是50个字符,修改为350个字符  
  372.                 highlighter.setTextFragmenter(fragmenter);  
  373.   
  374.                 String highLightText = highlighter.getBestFragment(analyzer,  
  375.                         "articleContent", text);  
  376.                 String highLightText2 = highlighter.getBestFragment(analyzer,  
  377.                         "articleName", text2);  
  378.                 if (highLightText2 != null) {  
  379.                     logQuery.setArticleName(highLightText2);  
  380.                 } else {  
  381.                     logQuery.setArticleName(doc.get("articleName"));  
  382.                 }  
  383.                 if (highLightText != null) {  
  384.                     logQuery.setArticleContent(highLightText);  
  385.                 } else {  
  386.                     logQuery.setArticleContent(doc.get("articleContent"));  
  387.                 }  
  388.                 logQuery.setArticleId(doc.get("articleId"));  
  389.                 logQuery.setIsMywrite(keyword);  
  390.                 logQuery.setArticleKindName(doc.get("articleKindName"));  
  391.   
  392.                 logQuery.setWriteTime(doc.get("writeTime"));  
  393.                 listlog.add(logQuery);  
  394.             }  
  395.             searcher.close();  
  396.         } catch (IOException ex) {  
  397.             ex.printStackTrace();  
  398.         }  
  399.         return listlog;  
  400.   
  401.     }  
  402. }  
原创粉丝点击