cnodejs的搜索用的是google的搜索,国内访问还是有点麻烦 数据是接口拿的,1小时更新一次数据(只拿第一页的,就第一次是拿的全部数据) 后面想办法多抓几个网站的数据 欢迎大家使用!! 地址:http://so.tomoya.cn
两小时惨案
来自酷炫的 CNodeMD
收藏了,没翻墙的用这个做站内搜索挺好
@SHocker-Yu 是吧,谢谢
来自酷炫的 CNodeMD
楼主能否共享下源码?
可以说下思路吗?不会java,想问问用node.js能不能实现。 我也想写一个这样的,但是现在只会简单的爬虫,完全不知道数据爬下来后该怎么办了。
请问你是将爬到的数据存到了数据库,然后搜索的时候,自己查数据库吗?
请问你是将爬到的数据存到了数据库,然后搜索的时候,自己查数据库吗?
是的,楼主是一小时抓取一次数据,填充到数据库。
存储的时候使用了hibernate search,这个东西是一个持久化全文检索框架,中文的分词用的是IKAnalyzer。说白了,就是把抓取的数据,截取出关键字,建立索引,这样就可以实现通过关键字搜索。
以上是通过楼主提供的信息猜的,技术核心主要是分词技术。
Node要去实现,去找找看分词的相关框架
@TakWolf 恩,谢谢楼主。我再去了解一下看看。
@wendaosanshou 大致就是 @TakWolf 说的那样实现的,node里也有分词器 https://github.com/leizongmin/node-segment 有兴趣可以研究研究
@TakWolf 请问抓取到的内容怎么截取关键字做索引呢?
PY搜索?
@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 谢谢大神耐心回复啊。太感谢了。
我大概理解了,就是抓数据的时候通过分词将title
和content
的关键字存在key里,然后搜索的时候,传搜索关键字过来,遍历存的每一组数据,并且遍历数据里面的key,如果有包含搜索关键字的数据,就将这组数据存起来,最后将所有包含搜索关键字的数据一起返回给前端。
@TakWolf 有个问题想问问你哈。
因为现在content
的内容一般都非常多,一般分词的话,会分出差不多200度条数据。
我感觉是不是存数据的时候不需要使用分词来存关键字。只是在查询数据库的时候,将查询的语句分词然后在数据库里遍历所有分词,查询包含任意分词的title
或content
。
比如:
我前端查如何学习vue.js
分词后为[如何,学习,vue.js]
然后将数据遍历查询后台数据库,看title和content是不是包含这些关键词。
请问这样可行吗?