1. 程式人生 > >java課程設計團隊(搜索引擎)

java課程設計團隊(搜索引擎)

plc 簡介 mpi hasclass findall image doc style agen

JAVA課程設計

基於學院網站的搜索引擎

對學院網站進行抓取、建索(需要中文分詞)、排序(可選)、搜索、摘要顯示。可以是GUI界面,也可以是Web界面。

一、團隊介紹

學號

班級

姓名

簡介

201621123049

網絡1612

[組長]袁德興

熱衷於網絡安全

201621123047

網絡1612

陳芳毅

有思想,有深度 ,有能力

201621044079

網絡1612

韓燁

學習力強,人稱韓可愛

201621123055

網絡1612

劉兵

人稱五社區發哥,動手能力強

201621123054

網絡1612

張晨曦

掌管學校所有社團,足球一級6

二、項目git地址

碼雲地址

三、項目git提交記錄截圖

技術分享圖片

四、項目主要使用技術

Httplcient

Jsoup

多線程

數據庫dao模式

IKAnanyzer

Lucene

Javascript /jQuery

Bootstrap

Web

五、項目其余特點

容錯處理完善

界面美觀

有配置文件

數據量大的時候查詢速度依舊快

六、項目功能架構圖與主要功能流程圖

技術分享圖片

七、項目運行截圖

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

八、項目關鍵代碼

        try {
            Document doc=Jsoup.connect("http://cec.jmu.edu.cn/").get();
            Elements links = doc.select(".menu0_0_");  
            for (Element link : links) {  
                lis1.add(oriurl+link.attr("href"));
            }  
        } catch (IOException e1) {
            e1.printStackTrace();
        }


      try {
            CloseableHttpResponse response = httpClient.execute(httpget, context);
            try {
                HttpEntity entity = response.getEntity();
                Document doc=Jsoup.parse(EntityUtils.toString(entity,"utf8"));
                Elements links=doc.select(".c124907");    
                for (Element link : links) {  
                    lis1.add(url +link.attr("href"));
                }   
                String pattern ="\\?a2t=([0-9]{1,})&a2p=[0-9]{1,}&a2c=10&urltype=tree.TreeTempUrl&wbtreeid=([0-9]{1,})";  
                Elements links1=doc.select("a[href]"); 
                for (Element link1 : links1) {
                    String line=link1.attr("href");
                    Pattern r = Pattern.compile(pattern);
                    Matcher m = r.matcher(line);
                    int i=0;
                    if (m.find( )) {
//                       System.out.println("Found value: " + m.group(0) );
                        int j=Integer.parseInt(m.group(1));
                        if(j>7){
                            for(int k=1;k<j+1;k++){
                                lis.add("?a2t="+String.valueOf(j)+"&a2p="+String.valueOf(k)+"&a2c=10&urltype=tree.TreeTempUrl&wbtreeid="+m.group(2));
                                }
                            }
                        else{
                        lis.add(m.group(0));
                        }


       CloseableHttpResponse response = httpClient.execute(httpget, context);
            try {
                HttpEntity entity = response.getEntity();
                Document doc=Jsoup.parse(EntityUtils.toString(entity,"utf8"));
                Elements links=doc.select(".c124907");    
                for (Element link : links) {         
                    lis.add(link.attr("href"));
                    
                }  


            try {
                HttpEntity entity = response.getEntity();
                Document doc=Jsoup.parse(EntityUtils.toString(entity,"utf8"));
                String title = doc.select(".contentstyle124904").text(); 


 Crawl crawl=new Crawl(httpget.getURI().toString(),doc.title().toString(),title);
                CrawlDaoImpl test=new CrawlDaoImpl();
                try {
                    if(bool){
                    test.add(crawl);
                    System.out.println(httpget.toString()+"添加成功");
                    }
                    
                    else{
                        System.out.println("添加失敗");


jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
jdbc.driver=com.mysql.jdbc.Driver


    @Override
    public Crawl findById(int id) throws SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Crawl p = null;
        String sql = "select url,abs,description from crawl where id=?";
        try{
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if(rs.next()){
                p = new Crawl();
                p.setId(id);
                p.setUrl(rs.getString(1));
                p.setAbs(rs.getString(2));
                p.setDescription(rs.getString(3));
            }
        }catch(SQLException e){
            e.printStackTrace();
            throw new SQLException("*");
        }finally{
            DBUtils.close(rs, ps, conn);
        }
        return p;
    }


public class IndexManager {
    @Test
    public void createIndex() throws Exception {
        // 采集數據
        CrawlDao dao = new CrawlDaoImpl();
        List<Crawl> list = dao.findAll();
        // 將采集到的數據封裝到Document對象中
        List<Document> docList = new ArrayList();
        Document document;
        for (Crawl crawl : list) {
            document = new Document();
            // store:如果是yes,則說明存儲到文檔域中
            Field id = new IntField("id", crawl.getId(), Store.YES);
            Field url = new StoredField("url", crawl.getUrl());
            Field abs = new StoredField("abs", crawl.getAbs());
            Field description = new TextField("description",
                    crawl.getDescription(), Store.YES);
            document.add(id);
            document.add(url);
            document.add(abs);
            document.add(description);
            docList.add(document);
        }
        // 創建分詞器,標準分詞器
        // Analyzer analyzer = new StandardAnalyzer();
        // 使用ikanalyzer
        Analyzer analyzer = new IKAnalyzer();
        // 創建IndexWriter
        IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3,
                analyzer);
        // 指定索引庫的地址
        File indexFile = new File("C:\\test1\\aaa\\");
        Directory directory = FSDirectory.open(indexFile);
        IndexWriter writer = new IndexWriter(directory, cfg);
        // 通過IndexWriter對象將Document寫入到索引庫中
        for (Document doc : docList) {
            writer.addDocument(doc);
        }
        writer.close();
    }


public class IndexSearch {
    
    List<Crawl> lis1=new ArrayList();
    public List doSearch(Query query) throws InvalidTokenOffsetsException {
        // 創建IndexSearcher
        // 指定索引庫的地址
        try {
            File indexFile = new File("C:\\test1\\aaa\\");
            Directory directory = FSDirectory.open(indexFile);
            IndexReader reader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
            // 通過searcher來搜索索引庫
            // 第二個參數:指定需要顯示的頂部記錄的N條
            TopDocs topDocs = searcher.search(query, 20);
            // 根據查詢條件匹配出的記錄總數
            int count = topDocs.totalHits;
//          ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            String filed="description";  
//          TopDocs top=searcher.search(query, 100);  
            QueryScorer score=new QueryScorer(query,filed);//傳入評分  
            SimpleHTMLFormatter fors=new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>");//定制高亮標簽  
            Highlighter  highlighter=new Highlighter(fors,score);//高亮分析器  
//           highlighter.setMaxDocCharsToAnalyze(10);//設置高亮處理的字符個數  
            for(ScoreDoc sd:topDocs.scoreDocs){  
                Document doc=searcher.doc(sd.doc);  
                String description=doc.get(filed);  
           //Lucene中分詞的所有信息我們都可以從TokenStream流中獲取.  
                TokenStream token=TokenSources.getAnyTokenStream(searcher.getIndexReader(), sd.doc, "description", new IKAnalyzer(true));//獲取tokenstream  
                Fragmenter  fragment=new SimpleSpanFragmenter(score);  //根據這個評分新建一個對象     
                highlighter.setTextFragmenter(fragment);  //必須選取最合適的    
                highlighter.setTextFragmenter(new SimpleFragmenter());//設置每次返回的字符數 
                String str=highlighter.getBestFragment(token, description);//獲取高亮的片段,可以對其數量進行限制  
                Crawl crawl = new Crawl();
                crawl.setDescription(str);
                crawl.setAbs(doc.get("abs"));
                crawl.setUrl(doc.get("url"));
                lis1.add(crawl);
            }       
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lis1;
        
    }
    


<div id="test"> <img src="./img/logo.png" height="300" width="250"/></div>

    <form action="./query2.jsp" method="GET">
        <div class="search-wrapper">
            <div class="input-holder">
                <input type="text" class="search-input" placeholder="" name="name"/>
                <button class="search-icon" onclick="searchToggle(this, event);"><span></span></button>
            </div>
            <span class="close" onclick="searchToggle(this, event);"></span>
            <div class="result-container">

            </div>
        </div>
    </form>


<script src="js/jquery-1.11.0.min.js" type="text/javascript"></script>
<script type="text/javascript">
    function searchToggle(obj, evt){
        var container = $(obj).closest('.search-wrapper');

        if(!container.hasClass('active')){
              container.addClass('active');
              evt.preventDefault();
        }
        else if(container.hasClass('active') && $(obj).closest('.input-holder').length == 0){
              container.removeClass('active');
        
              container.find('.search-input').val('');
        
              container.find('.result-container').fadeOut(100, function(){$(this).empty();});
        }
    }

    function submitFn(obj, evt){
        value = $(obj).find('.search-input').val().trim();

        _html = "Yup yup! Your search text sounds like this: ";
        if(!value.length){
            _html = "Yup yup! Add some text friend :D";
        }
        else{
            _html += "<b>" + value + "</b>";
        }

        $(obj).find('.result-container').html('<span>' + _html + '</span>');
        $(obj).find('.result-container').fadeIn(100);

        evt.preventDefault();
    }
</script>


<script type="text/javascript">


$(function(){
    var Count = "<%=i %>";//記錄條數
    var tmp = "<%=test %>";
    var PageSize=5;//設置每頁示數目
    var PageCount=Math.ceil(Count/PageSize);//計算總頁數
    var currentPage =1;//當前頁,默認為1。
    //造個簡單的分頁按鈕
    for(var i=1;i<=PageCount;i++){
        if(PageCount==1){
        }//如果頁數為1的話,那麽我們就是不分頁

        else{
        var pageN='<li style=\"font-size:30px\"><a href="?name='+tmp+'&a='+i+'">'+i+'</a></li>';
        
        $('.pagination').append(pageN);
    }

    }
    
    //顯示默認頁(第一頁)

});  
</script>


<%

String d =request.getParameter("a");    
//out.print(d+"<br>");
int b=0;
int k=0;
if(i!=0&&d==null){
    for(Crawl crawl: lis){
        if(5>k&&k>=0){
            out.print("<h3><p class=\"text-center\"><a href=\""+crawl.getUrl()+"\">"+crawl.getAbs()+"</a></p></h3>"); 
            out.print("<p class=\"text-center\">"+crawl.getDescription()+"<br>");  
            out.print("<br>");
        }
        k=k+1;
    }
    
    
}
else{
if(d!=null){
int c=Integer.valueOf(d);
//out.print(c);
for(Crawl crawl: lis){
    if(c*5>b&&b>=(c-1)*5){
        if(crawl.getDescription()==null){
            out.print("");
        }
        else{
            out.print("<h3><p class=\"text-center\"><a href=\""+crawl.getUrl()+"\">"+crawl.getAbs()+"</a></p></h3>"); 
            out.print("<p class=\"text-center\">"+crawl.getDescription()+"<br>"); 
        out.print("<br>");

        }
    }
    b=b+1;  
}
}
}
%>


尚待改進或者新的想法

變量的命名不太規範

可以嘗試著去做一個只有修改部分參數,就可以去爬取別的網站的搜索引擎


團隊成員任務分配

姓名

任務

袁德興

利用Lucene和IKanalyzer進行檢索,部分前後端內容與模塊銜接

陳芳毅

采用httpclient和jsoup,進行爬取和解析,部分數據庫內容

韓燁

采用數據庫的dao模式將jsoup解析後的內容進行存儲,部分前端和logo的設計

劉兵

采用bootstrap和jsp等進行前端界面的設計和後端代碼實現

張晨曦

采用jquery和jsp等進行前端界面的設計和後端代碼的實現

java課程設計團隊(搜索引擎)