一步一步做搜索(一)

感謝楓伶憶 

  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 了。還有盤古分詞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章