感謝楓伶憶
http://www.cnblogs.com/fenglingyi/p/4708006.html
自從瞭解到搜索優化,分詞和權重之後,一直苦於沒有結構化的培訓數據來做搜索,現在總算可以體驗一把了。楓伶憶大大發表博客後半天時間 我就開始在博客園上爬數據,結果爬了一晚上才爬了12w條數據存到數據庫,還是比較擔心博客園崩潰的,畢竟可以預想到,會有多少人同時開始在博客園爬數據了,嘿嘿 還好沒啥事。
剛把圖表做出來時別提有多激動了,成就感啊。慢慢的發現然並卵啊。不過我的初衷不是這個,我還是要做搜索,現在數據有了,那就開工唄。
一開始我就按普通查詢來搜索數據庫,發現模糊搜索並不能令我滿意,再對比一下百度,完全就是渣啊。然後就有了分詞的想法,想到就做
char[] slist = keyword.ToCharArray();
將輸入關鍵字分解成一個個字符,然後去拼接sql,結果自然不滿意 因爲查到的數據太雜亂了 再對比下百度,還是渣啊。怎麼辦呢 爲毛人家搜索出來的東西就是準確率那麼高呢,我想到了權重 然後大量查資料,得到了如下的sql
SELECT TOP 15 BlogTitle,BlogTime,BlogUrl FROM BlogActicle WHERE (BlogId >(SELECT MAX(BlogId) FROM (SELECT TOP 20 BlogId FROM BlogActicle ORDER BY BlogId) AS T ) ) and BlogTitle like '%" + keyword + "%'" + substr + " ORDER BY (case when BlogTitle like '%" + keyword + "%' then 3 when BlogTitle like '%" + (keyword.Length > 1 ? slist[0] + slist[1] : slist[0]) + "%' then 2 when BlogTitle like'%" + slist[0] + "%'" + substr + " then 1 end ) desc
我將權重設爲3級 完全匹配關鍵字的 設爲3 匹配2個字的設爲2 匹配一個就爲1 然後將權重排序 便會將權重最高的排在前
然後再對比百度,尼瑪 人家關鍵字是高亮顯示,費了一番功夫 從網上剽竊下來一段代碼
//切詞替換成高亮
public static string HighlightKeyword(string str, char[] keywordValues)
{
int index;
string highlightBegin = "<>";
string highlightEnd = "</>";
for (int i = 0; i < keywordValues.Length; i++)
{
int startIndex = 0;
int length = highlightBegin.Length + keywordValues[i].ToString().Length;
int lengthHighlight = length + highlightEnd.Length;
var temp = str.ToLower();
var temp1 = keywordValues[i].ToString().ToLower();
while((index = str.IndexOf(keywordValues[i].ToString(), startIndex, StringComparison.OrdinalIgnoreCase)) > -1)
{
str = str.Insert(index, highlightBegin).Insert(index + length, highlightEnd);
startIndex = index + lengthHighlight;
}
}
//將<>字符串替換<em>
str = str.Replace("<>", "<em>").Replace("</>", "</em>");
return str;
}
最後得到效果圖如下:
看到logo和樣式是不是很熟悉呀,沒錯,就是百度的樣式被我扒下來了。
接下來有做了用戶輸入歷史記錄匹配
然後再去看本地的txt文件裏面都是我的輸入記錄,不禁感覺有點後怕,尼瑪 平常用搜索引擎查東西 百度和瀏覽器 手機UC 記錄了我多少個人記錄,太沒安全感了 。
接下來地球人已經阻擋不了我要做全文搜索了。但是數據庫數量太多 單個字段 表查還好,全局那不得龜速啊 怎麼辦呢,經常逛博客園 當然知道 檢索神器Lucene 了。還有盤古分詞