写了个检索网站,目前内容就只有cnodejs
发布于 8 年前 作者 tomoya92 4650 次浏览 来自 分享

cnodejs的搜索用的是google的搜索,国内访问还是有点麻烦 数据是接口拿的,1小时更新一次数据(只拿第一页的,就第一次是拿的全部数据) 后面想办法多抓几个网站的数据 欢迎大家使用!! 地址:http://so.tomoya.cn

16 回复

两小时惨案

来自酷炫的 CNodeMD

@TakWolf ??什么意思

来自酷炫的 CNodeMD

收藏了,没翻墙的用这个做站内搜索挺好

@SHocker-Yu 是吧,谢谢

来自酷炫的 CNodeMD

楼主能否共享下源码?

@jieyou 源码就不共享了,网站用的技术我说下 hibernate hibernate search(分词是ik) spring springmvc quartz jodd(http请求) freemarker jsoup

来自酷炫的 CNodeMD

可以说下思路吗?不会java,想问问用node.js能不能实现。 我也想写一个这样的,但是现在只会简单的爬虫,完全不知道数据爬下来后该怎么办了。

请问你是将爬到的数据存到了数据库,然后搜索的时候,自己查数据库吗?

@wendaosanshou

请问你是将爬到的数据存到了数据库,然后搜索的时候,自己查数据库吗?

是的,楼主是一小时抓取一次数据,填充到数据库。

存储的时候使用了hibernate search,这个东西是一个持久化全文检索框架,中文的分词用的是IKAnalyzer。说白了,就是把抓取的数据,截取出关键字,建立索引,这样就可以实现通过关键字搜索。

以上是通过楼主提供的信息猜的,技术核心主要是分词技术。

Node要去实现,去找找看分词的相关框架

@TakWolf 恩,谢谢楼主。我再去了解一下看看。

@wendaosanshou 大致就是 @TakWolf 说的那样实现的,node里也有分词器 https://github.com/leizongmin/node-segment 有兴趣可以研究研究

@TakWolf 请问抓取到的内容怎么截取关键字做索引呢?

@wendaosanshou 本人非楼主,楼主是 @liygheart

请问抓取到的内容怎么截取关键字做索引呢?

抓取到数据之后,第一步要获取关键字。 关键字截取是通过分词引擎来实现的。以 node-segment 举个例子:

$ npm install segment --save

var Segment = require('segment');
var segment = new Segment();
segment.useDefault();
console.log(segment.doSegment('CNode是全球最大的中文NodeJS开发者社区'));

上面结果返回:

{ w: 'C', p: 16 },
{ w: 'Node', p: 8 },
{ w: '是', p: 4096 },
{ w: '全球', p: 1048576 },
{ w: '最大', p: 8 },
{ w: '的', p: 8192 },
{ w: '中文', p: 1048576 },
{ w: 'NodeJS', p: 8 },
{ w: '开发者', p: 1048576 },
{ w: '社区', p: 1048576 } 

我们参考文档的词性表(字段p),https://github.com/leizongmin/node-segment/blob/master/lib/POSTAG.js 忽略掉无意义词,例如我们只保留名词等,忽略掉副词、连词、量词等 赛选后,就变成了:

{ w: 'C', p: 16 },
{ w: 'Node', p: 8 },
{ w: '全球', p: 1048576 },
{ w: '最大', p: 8 },
{ w: '中文', p: 1048576 },
{ w: 'NodeJS', p: 8 },
{ w: '开发者', p: 1048576 },
{ w: '社区', p: 1048576 } 

然后我们创建一个数据库领域对象模型,结构类似于下面的结构, { id: xxx, key: ‘开发者’, keyTarget: ‘title’ or ‘content’ sourceType: ‘topic’, sourceId: xx, sourceSummary: ‘CNode是全球最大的中文NodeJS开发者社区’, sourceLink: ‘http://cnodejs.org/topic/xxxxx’ }

抓取到CNodeJS的Topic对象之后,对title和content属性做分词处理,然后生成上面的领域结构,存到数据库 检索的时候,通过key这个列名检索

上面只是一个大概的思路,这个过程可能还需要处理去重之类的问题

@TakWolf 谢谢大神耐心回复啊。太感谢了。 我大概理解了,就是抓数据的时候通过分词将titlecontent的关键字存在key里,然后搜索的时候,传搜索关键字过来,遍历存的每一组数据,并且遍历数据里面的key,如果有包含搜索关键字的数据,就将这组数据存起来,最后将所有包含搜索关键字的数据一起返回给前端。

@TakWolf 有个问题想问问你哈。 因为现在content的内容一般都非常多,一般分词的话,会分出差不多200度条数据。

我感觉是不是存数据的时候不需要使用分词来存关键字。只是在查询数据库的时候,将查询的语句分词然后在数据库里遍历所有分词,查询包含任意分词的titlecontent

比如: 我前端查如何学习vue.js 分词后为[如何,学习,vue.js] 然后将数据遍历查询后台数据库,看title和content是不是包含这些关键词。

请问这样可行吗?

回到顶部