首先自問自答幾個問題,以讓各位看官了解寫此文的目的
什麼是站内搜尋?與一般搜尋的差別? 很多網站都有搜尋功能,很多都是用SQL語句的Like實作的,但是Like無法做到模糊比對(例如我搜尋“.net學習”,如果有“.net的學習”,Like就無法搜尋到,這明顯不符合需求,但是站内搜尋就能做到),另外Like會造成全盤掃描,會對資料庫造成很大壓力,為什麼不用資料庫全文檢索,跟普通SQL一樣,很傻瓜,靈活性不行
為什麼不用百度、google的站内搜尋? 畢竟是别人的東西,用起來肯定會受制于人(哪天你的網站火了,它看你不爽了,就可能被K),主要還是索引的不夠及時,網站新的内容,需要一定時間才能被索引到,并且使用者的體驗也不太好
最近改造了《動力起航》的站内搜尋的功能,它其實已經有站内搜尋的功能,但是是用like來實作的,改造此功能是本着在盡可能少的修改網站的源代碼的情況下去改造此功能以及此站内搜尋功能可以很好的移植到其他項目的原則來編寫!
站内搜尋使用的技術 Log4Net 日志記錄
lucene.Net 全文檢索開發包,隻能檢索文本資訊
分詞(lucene.Net提供StandardAnalyzer一進制分詞,按照單個字進行分詞,一個漢字一個詞)
盤古分詞 基于詞庫的分詞,可以維護詞庫
首先我們新增的SearchHelper類需要将其做成一個單例,使用單例是因為:有許多地方需要使用使用,但我們同時又希望隻有一個對象去操作,具體代碼如下:
其次,使用Lucene.Net需要将被搜尋的進行索引,然後儲存到索引庫以便被搜尋,我們引入了“生産者,消費者模式”. 生産者就是當我們新增,修改或删除的時候我們就需要将其在索引庫進行相應的操作,我們将此操作交給另一個線程去處理,這個線程就是我們的消費者,使用“生産者,消費者模式”是因為:索引庫使用前需解鎖操作,使用完成之後必須解鎖,是以隻能有一個對象對索引庫進行操作,避免資料混亂,是以要使用生産者,消費者模式
首先我們來看生産者,代碼如下:
下面是消費者,消費者我們單獨一個線程來進行任務的處理:
以上我們就把索引庫建立完畢了,接下來就是進行搜尋了,搜尋操作裡面包括對搜尋關鍵詞進行分詞,其次是搜尋内容搜尋詞高亮顯示,下面就是搜尋的代碼:
以上我們的站内搜尋的SearchHelper類就建立好了,下面來講講如何使用,此類提供以下幾個方法對外使用:
在Global裡面啟動消費者線程:
在需被搜尋的新增或修改處添加下面方法:
在需被搜尋的删除處添加下面方法:
搜尋的時候使用下面的方法即可:
以上就是整個站内搜尋的全部代碼 本來想直接提供改造了《動力起航》的源代碼,這樣就可以直接看到效果了,一方面由于檔案過大,另一方面不知道是不是會侵權,所有沒有提供下載下傳.如果有需要的朋友可以留下郵箱我将發給你,但僅供學習交流之用,誤用做商業用途,以上如果有侵權等問題還請及時告知我,以便我及時更正!