前言
前兩天寫了兩篇(一個Python小白5個小時爬蟲經歷,一個Python小白5個小時爬蟲經歷 【續】)分別實現了部落格園的列表頁部落格收集,和資料匯入。後來發現部落格園只是允許訪問到4000條左右的資料,於是我又根據關鍵字搜尋到“找找看”頁面收集。總共數量也不多,不過也夠做測試的了。本部落格要講的內容主要是關於ElasticSearch(下文中用ES表示)的。當然也沒有什麼難度,畢竟第三方的包和ES本身的功能就能實現。
注意,本人部落格偏向實踐總結類,所以理論上的東西比較少,如果不知道什麼叫做ES並且對本文有興趣閱讀的,可以先補充一下基礎知識,或者緊緊抱著好奇的心態看完本人也非常歡迎。
實戰
資料前階段已經導好了。目前15785條(部落格園首頁4000+精華+待稽核+各種關鍵字搜尋)
下面要做的就是扒下部落格園找找看頁面的程式碼(我沒有用工具,一點一點複製貼上的,著實也不容易。有沒有好的工具推薦?)首先,建一個Web專案(Core和非Core都行),然後把頁面考進去,除錯一下,直到執行demo頁面正常即可。具體頁面樣式可參考:http://zzk.cnblogs.com/s/blogpost?Keywords=net
ES對接
下面就是C#呼叫ElasticSearch服務了。我用的是Nest。用NuGet安裝就好。Install Package Nest。我裝的是最新5.2.0版本。
為了檢索方便呢,我們搜尋的實體和ES伺服器的最好對應,正如上面的截圖一樣。實體類:
public class Blog { public string id { get;set; } public string author { get; set; } public string title { get; set; } public int view_num { get; set; } public int comment_num { get; set; } public int goods_num { get; set; } public string summary { get; set; } public string href { get; set; } public DateTime create_time { get; set; } public string author_url { get; set; } }
因為我用的MVC,所以直接用MVC的方式到前端繫結資料了。
到此為止呢,頁面繫結已經結束了。關鍵是資料怎麼出,其實Nest已經幫你做好了一切,不過呢,還需要你在瞭解一下如何呼叫,我也是下載了NEST原始碼看了他的測試用例才學會的。程式碼如下:
var nodes = new Uri[] { new Uri("http://myserver1:9200"), new Uri("http://myserver2:9200"), new Uri("http://myserver3:9200") }; var pool = new StaticConnectionPool(nodes); var settings = new ConnectionSettings(pool); var client = new ElasticClient(settings);
得到client之後,呼叫client.Search<T>()方法
ISearchResponse<Entities.CnBlogs.Blog> response = _builder?.Client.Search<Entities.CnBlogs.Blog>(s =>s .Type("blog")//type .Index(index??_defaultIndex)//index 這裡時cnblogs .From(from) //從第幾條開始 .Size(pageSize)//取多少條 .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.Or)))//根據關鍵字查詢(查詢方式有很多種,這裡只是為了做簡單演示) .Highlight(h => //設定高亮 h.PreTags("<strong>")//改成strong以符合部落格園的樣式 .PostTags("</strong>")// .Fields( hf => hf.Field(p => p.title)//標題高亮 .HighlightQuery(q => q .Match(m => m .Field(p => p.title) .Query(keyword) ) ), hf => hf.Field(p => p.summary)//簡介高亮 .HighlightQuery(q => q .Match(m => m .Field(p => p.summary) .Query(keyword) ) )) ) );
接下來,執行一下,看看效果,這裡因為沒有根據關鍵字搜尋,所以高亮沒有顯示
然後,我們進行關鍵字搜尋,輸入net,搜一下試試,效果出來了是不是,不過html標籤沒解析。沒關係,MVC中用 @Html.Raw(“”)就可以解決啦
最終效果:
當然呢,如果你在實踐過程中發現並沒有所謂的高亮,那是因為列表出來之後要對列表需要高亮的欄位進行處理,處理程式碼如下:
response.Hits.ToList().ForEach(x => { if (x.Highlights?.Count > 0) { string titleHighlights = string.Join("", x.Highlights["title"].Highlights); string summaryHighlights = string.Join("", x.Highlights["summary"].Highlights); x.Source.title = titleHighlights; x.Source.summary = summaryHighlights; } result.Add(x.Source); });
總結
整體流程其實和資料庫開發是一樣的。新增資料,讀取資料,繫結資料。只不過不同的是,蒐集資料使用python爬的。其他功能均用.NET Core開發。不過還是處在學習階段,繼續加油吧,本篇到此為止,如果覺得本篇對您有幫助,點個推薦不介意吧。
本文程式碼稍後將同步到github。https://github.com/dotnetlive/dotnetlive.search/tree/master/src/DotNetLive.Search.Demo