ElasticSearch 【仿】博客園找找看頁面搜索實現


 前言

  前兩天寫了兩篇(一個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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM