前两天写了两篇(一个Python小白5个小时爬虫经历,一个Python小白5个小时爬虫经历 【续】)分别实现了博客园的列表页博客收集,和数据导入。后来发现博客园只是容许访问到4000条左右的数据,因而我又根据关键字搜索到“找找看”页面收集。总共数量也很少,不过也够作测试的了。本博客要讲的内容主要是关于ElasticSearch(下文中用ES表示)的。固然也没有什么难度,毕竟第三方的包和ES自己的功能就能实现。html
注意,本人博客偏向实践总结类,因此理论上的东西比较少,若是不知道什么叫作ES而且对本文有兴趣阅读的,能够先补充一下基础知识,或者牢牢抱着好奇的心态看完本人也很是欢迎。前端
数据前阶段已经导好了。目前15785条(博客园首页4000+精华+待审核+各类关键字搜索)node
下面要作的就是扒下博客园找找看页面的代码(我没有用工具,一点一点复制粘贴的,着实也不容易。有没有好的工具推荐?)首先,建一个Web项目(Core和非Core都行),而后把页面考进去,调试一下,直到运行demo页面正常便可。具体页面样式可参考:http://zzk.cnblogs.com/s/blogpost?Keywords=netpython
下面就是C#调用ElasticSearch服务了。我用的是Nest。用NuGet安装就好。Install Package Nest。我装的是最新5.2.0版本。git
为了检索方便呢,咱们搜索的实体和ES服务器的最好对应,正如上面的截图同样。实体类:github
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) ) )) ) );
接下来,运行一下,看看效果,这里由于没有根据关键字搜索,因此高亮没有显示post
而后,咱们进行关键字搜索,输入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