天天看點

關于站内搜尋的那些事兒

<a href="#%E5%89%8D%E8%A8%80">前言</a>

<a href="#%E6%A8%A1%E5%9D%97%E5%8C%96">子產品化</a>

<a href="#%E7%99%BB%E5%BD%95%E6%A8%A1%E5%9D%97">登入子產品</a>

<a href="#%E5%8D%9A%E5%AE%A2%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%9D%97">部落格掃描子產品</a>

<a href="#%E5%8D%9A%E5%AE%A2%E8%AF%A6%E6%83%85%E6%A8%A1%E5%9D%97">部落格詳情子產品</a>

<a href="#%E6%90%9C%E7%B4%A2%E6%A8%A1%E5%9D%97">搜尋子產品</a>

<a href="#%E6%BC%94%E7%A4%BA">示範</a>

<a href="#%E6%A1%88%E4%BE%8B%E4%B8%80">案例一</a>

<a href="#%E6%A1%88%E4%BE%8B%E4%BA%8C">案例二</a>

<a href="#%E6%80%BB%E7%BB%93">總結</a>

之前學過一點點關于全文檢索相關的技術,當時使用的是Java語言,Lucene和compass架構。有興趣的話可以參考下面的專欄連結

<a href="http://blog.csdn.net/column/details/lucene-compass.html" target="_blank">http://blog.csdn.net/column/details/lucene-compass.html</a>

然後現在用的是Python了,是以需要疊代一下。網上搜尋了下,相關的還真不少,還有pylucene,但是相比較而言,whoosh更為出色。那今天就用它吧。

安裝它也比較簡單。

這樣就可以了。

目标: 對自己的部落格進行“站内搜尋”,來稍微改善一下CSDN站内查找的缺點。

最近越來越喜歡把任務子產品化了,這樣單個的功能也比較容易管理,而且整合的時候對內建測試也比較友善。或者添加新功能,重構,都很友善。

針對上面的需求,我這裡設計了幾個小子產品,待會逐個進行解釋。

登入子產品是有點必須的,這是因為在擷取部落格詳細内容的時候,需要有一個已經登入的session會話來支撐,否則拿不到資料。

先前也寫過一點關于CSDN模拟登陸的例子,當時完成的功能有

模拟登陸

頂、踩文章

發評論

擷取部落客詳情

為了不讓别有用心的人拿代碼做壞事,我這裡就不貼代碼了。技術方面歡迎私信,或者在文章下面發評論。

下面把模拟登陸的代碼補上。

部落格掃描這個子產品不需要登入狀态的支援,完成的功能是掃描部落客的文章總數,以及每個文章對應的URL連結。因為接下來會用它來擷取文章的詳情。

關于部落格詳情,我倒是覺得CSDN做的真不賴。而且是json格式的。話不多說,看下登入狀态下能擷取到的部落格的詳細内容吧。

關于站内搜尋的那些事兒

這下思路很清晰了,就是要擷取标題,URL,标簽,摘要描述, 文章正文内容。代碼如下:

搜尋子產品是今天的核心,使用到的庫就是whoosh, 真的是很貼心的一個庫,而且文檔詳細,簡單易懂。我這蹩腳的英文水準都可以,你也一定可以的。

預設的文本分析器是英文的,是以為了更好的照顧到中文相關,就得處理一下中文分詞,于是在網上抄了一個,不過效果不咋地。

好了,差不多就是這樣了。下面來看下運作的效果。

首先看下對于DBHelper這個關鍵字的搜尋, 因為文章過多的話計算也是比較慢的,是以就爬取前幾篇文章好了。

代碼運作結果如下:

關于站内搜尋的那些事兒

不難發現,本人部落格隻有前兩篇是關于DBHelper 的文章,是以命中了這兩個document。看起來還不錯。

下面再來試試其他的關鍵字。比如Python。

然後依然來看下運作的效果。

關于站内搜尋的那些事兒

命中了4條記錄,命中率也還算說得過去。

最後來總結下。關于whoosh站内搜尋的問題, 要向更高精度的比對到文本結果,其實還需要很多地方優化。QueryParser 這塊其實還有很多需要挖掘。

另外高亮顯示查找結果也是很友善的。官方文檔上有詳細的介紹。

最後一步就是中文問題,目前我還沒有什麼好的辦法來提高分詞和命中率。