java課程設計團隊(搜索引擎)
阿新 • • 發佈:2018-01-25
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課程設計團隊(搜索引擎)