Reference: http://blog.csdn.net/napoay/article/details/51477586
一、選題
工程類搜索型:
定向采集 3-4 個新聞網站, 實現這些網站信息的抽取、索引和檢索。網頁數 目不少於 10 萬條。能按相關度、時間、熱度 (需要自己定義) 等屬性進行排序, 能實現相似 新聞的自動聚類。
要求: 有相關搜索推薦、snippet 生成、結果預覽 (鼠標移到相關結果, 能預覽) 功能
二、項目線上訪問地址
- 項目訪問地址:http://120.27.46.201:8080/UCASIR/ (檢索體育相關新聞)
- 代碼托管在 github 上:https://github.com/cseryp/UCASIR
三、開發工具
- jdk 版本:1.7
- 服務器:Tomcat7.0
- python:2.7
- scrapy:1.0
四、設計方案
4.1整體思路
在實現新聞信息檢索系統時首先進行了信息采集,信息采集結束之后使用 Lucene 提供的 api 構建索引庫, 前端使用 jsp 接收用戶查詢,在后台使用 servlet 對用戶查詢進 行分詞處理,之后到索引庫中進行文檔匹配, 最后把查詢結果集反饋給用戶並在前端頁面中 展示。
4.2信息采集
Scrapy 是 Python 開發的一個快速、高層次的屏幕抓取和 web 抓取框架,用於抓取 web 站點並從頁面中提取結構化的數據。我們采集了 10w+ 新聞數據, 新聞信息以 json 文件格 式保存。scrapy 采集流程:
采集到的新聞數據:
新聞格式: 
4.3倒排索引構建
在索引構建模塊,主要包括下面三個關鍵步驟: 數據預處理、新聞內容分詞、構建倒排 索引。
**數據預處理:**Gson 是 Google 提供的用來在 Java 對象和 JSON 數據之間進行映射的 Java 類庫。可以將一個 JSON 字符串轉成一個 Java 對象, 或者反過來。我們使用 Gson 把 json 文件轉換為 News 對象
**中文分詞:**IK Analyzer 是一個開源的,基於 java 語言開發的輕量級的中文分詞工具 包,IK 發展為面向 Java 的公用分詞組件,獨立於 Lucene 項目,同時提供了對 Lucene 的默 認優化實現。IK 分詞采用了特有的“正向迭代最細粒度切分算法“, 支持細粒度和智能分詞兩 種切分模式, 並且采用了多子處理器分析模式, 支持英文字母、數字、中文詞匯等分詞處理, 兼容韓文、日文字符。
**構建倒排索引:**Lucene 提供了構建倒排索引的方法,步驟如下圖所示:
Luke 是一個用於 Lucene 搜索引擎的,方便開發和診斷的第三方工具,它可以訪問
現有 Lucene 的索引. 使用 luke 打開索引目錄,可以看到新聞信息被存儲到索引庫中。 
4.4索引查詢
索引創建好以后,查詢可分為以下幾個步驟:
1. 設置查詢索引的目錄 (這里就是上面創建索引的目錄).
2. 創建 indexSearcher.
3. 設置 query 的分詞方式
4. 設置查詢域, 比如查詢域為 news title, 那么就到新聞標題域去比對 5. 設置查詢字符串,也就是要查詢的關鍵詞.
6. 返回結果是一個文檔集合,放在 TopDocs 中,通過循環 TopDocs 數組輸出查詢結果. 用戶一般只看前幾頁的數據,為了加快前端的數據展示, 返回前 1000 條數據到前台。
4.5關鍵字高亮
檢索結果高亮對於用戶的體驗度和友好度非常重要,可以快速標記出用戶檢索對關鍵 詞。Lucene 的 Highlighter 類可以用於返回文檔中的關鍵字高亮,通過在關鍵字前面添加 css 片段來實現。
4.6用戶界面
使用 jsp 編寫用戶界面,服務器為 Tomcat 7.0, 用戶輸入關鍵詞以后提交表單,后
台使用 servlet 接收用戶查詢, 之后把查詢字符串作為搜索的 key 到索引庫中搜索文檔。檢索效果: 
4.7按時間排序和結果分頁
按時間排序: 所有的新聞結果存放在一個 list 集合中,集合中的每個元素為一個 News 對象, 通過重寫 Comparator 類中的 compare 方法實現按集合中每個新聞元素的 Time 排 序。
結果分頁: 定義了一個 Page 類用來記錄當前頁、總頁數、每頁多少條數據、總的數據 數、每頁起始數、每頁終止數、是否有下一頁、是否有前一頁。
五、參考資料
下面列出可參考的資料:
1. lucene全文檢索基礎
2. lucene創建索引
3. Lucene查詢索引
4. Lucene查詢結果高亮
5. Lucene 查詢(Query)子類
6. java操作json
7. java集合
8. servlet基礎
六、總結
開源工具的使用顯著提高了開 發效率,但build from ground還需要學習很多東西,繼續沉淀。
歡迎批評指正。
