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