简单新闻搜索引擎的实现

简单新闻搜索引擎的实现

概述

文本主要介绍一个简单新闻搜索引擎项目的实现,主要包括四个部分:

  1. 新闻爬虫
  2. 使用elasticsearch存储数据
  3. 使用express搭建网站后端
  4. 使用vue搭建网站前端

项目github地址: github.com/joker-star-l

新闻爬虫

本项目爬取的是 中国新闻网、 新华网和 光明网三家新闻网站的国际新闻板块。其中中国新闻网和新华网的新闻条目是动态加载的,需要找到动态请求的接口;光明网的新闻条目是静态的,直接解析页面即可。下面介绍具体的爬取流程。

中国新闻网

在浏览器开发者工具中的network栏,我们可以找到动态加载新闻条目的接口: channel.chinanews.com.cn

中国新闻网新闻条目动态加载接口

该接口有三个query参数,分别为pager、pagenum和t。经测试,pager表示页码数;pagenum表示本次请求需要的新闻条数;t表示请求时间,如果不携带参数t也能得到结果。

在该接口返回的结果中,去掉开头的“specialcnsdata = ”和结尾的“;newslist = specialcnsdata;”,中间部分为json风格的字符串,其结构如下。"docs"为存储了新闻条目信息的数组,数组中每个元素的“url”字段是我们需要的信息。

拿到了新闻的url数组之后,便可以遍历请求数组中的每一个url,获得具体的新闻页面信息,代码如下。

新华网

类似地,我们可以在浏览器开发者工具中的network栏找到新华网动态加载新闻条目的接口: news.cn/worldpro/ds_8d5

该接口返回的格式为json,“datasource”为存储了新闻条目信息的数组。与中国新闻网不同的是,该接口没有参数,返回的新闻条数固定为1000。“datasource”中每个元素的结构如下(无关属性不在此列出),“publishUrl”字段是我们需要的信息。

类似地,我们可以遍历请求数组中的每一个url,获得具体的新闻页面信息,使用cheerio库来解析页面,此处不再赘述。

光明网

与上面两个网站不同的是,光明网的新闻条目是静态的,比如第一页新闻所在页面的url为 world.gmw.cn/node_4661.,第二页为 /node_4661_2.htm,第三页为 /node_4661_3.htm,以此类推,总共有10个页面。

光明网国际要闻界面

我们可以使用cheerio库来拿到页面上所有新闻条目的url,请求并解析具体新闻页面的工作与之前类似,不再赘述。

使用elasticsearch存储数据

Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名。

建立连接

在node.js中,我们可以用以下方式建立一个与elasticsearch连接的客户端。

存储结构

在elasticsearch中建立索引存储新闻数据,具体结构如下。

在elasticsearch中,类型为“text”的字段会被分词,这里对“title”、“abstract”和“content”三个字段进行分词。“md5”为新闻内容被md5算法加密后的结果,用于去重。在爬虫爬取新闻的过程中,很有可能会出现一篇新闻被多次爬取的情况,而且同一篇新闻很有可能发布在不同的网站上,因此不能根据url来去重,而是要根据新闻内容来去重。但新闻的内容普遍较长比较起来效率较低使用md5算法加密得到较短的字符串进行比较能够很好地解决这个问题。

添加数据

本项目中,数据添加过程分为以下2个步骤:

  1. 判重:计算新闻的md5,判断elasticsearch中是否包含该值;
  2. 插入:如果不包含,则插入数据。

对应的添加函数如下。

查询数据

本项目中,搜索过程分为以下3个步骤:

  1. 分词:对搜索内容进行分词;
  2. 匹配:匹配要求为新闻标题或者内容包含搜索内容分词的60%以上
  3. 排序:对匹配到的新闻首先根据elasticsearch计算出的相关性分数降序排序分数相同的则根据时间降序排序

对应的查询条件如下。

关于elasticsearch计算相关性分数的算法,在5.0版本以前使用的是TF/IDF算法,5.0版本以后改为了BM25算法,具体细节可以参考这篇博客。

使用express搭建网站后端

本项目后端较为简单,使用express框架快速搭建完成。

接口

1. 查询接口
   GET /search
   query参数:words
   根据words查询相关新闻

2. 时间热度分析接口
   GET /analyze
   query参数:words
   对words进行最近一周的时间热度分析

统一返回格式

规定标准的json数据返回格式。

{
    "code": 200,
    "msg": "success",
    "data": {}
}

统一异常处理

使用异常中间件进行统一的异常处理。

app.use((err, req, res, next) => {
    console.log('error: ' + err.message);
    res.send({
        code: 400,
        msg: err.message
    })
})

使用vue搭建网站前端

前端使用vue框架搭建,配合element-ui组件库以及echarts完成。

路由结构

export default new VueRouter({
    routes: [
        {
            path: '/',
            redirect: {
                path: '/search'
            }
        },
        {
            path: '/search',                          // 查询页面
            component: SearchPage
        },
        {
            path: '/news-list/:words/:random',        // 查询结果页面
            component: NewsListPage
        }
    ]
})

查询页面

查询页面

查询结果页面

显示查询结果,进行了分页处理,每页显示10条新闻,点击新闻标题即可跳转到相应的新闻页面。

提供“时间”和“相关性”两种排序方式,默认按照“相关性”排序。

查询结果页面

时间热度分析

显示时间热度分析图,横坐标为日期,纵坐标为相关的新闻条数。

时间热度分析

PHP网站源码济南百度seo推荐同乐优化哪家好曲靖企业网站建设价格定西网站开发推荐观澜百度竞价包年推广推荐韶关网站推广公司大丰seo网站优化公司白山SEO按天扣费公司清徐关键词按天收费价格诸城营销型网站建设报价淮安网页设计多少钱舟山设计公司网站公司池州外贸网站设计价格金华SEO按天收费多少钱淮安网站优化按天计费哪家好阜新网站推广多少钱大连营销网站公司松岗建设网站哪家好朝阳英文网站建设推荐喀什企业网站建设哪家好渭南企业网站制作公司陇南网站搜索优化价格肇庆模板制作松原模板制作多少钱绵阳seo优化哪家好常德阿里店铺运营哪家好玉林网站关键词优化报价玉树营销网站价格伊犁设计网站北京建网站报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化