众所周知,wordpress的搜索相当糟糕,它是硬性(完全)匹配,为了实现博客智能模糊搜索功能,为了尽可能达到百度等各大搜索引擎的搜索效果,就要分词准确与分词扩展。用户输入一段话,如何将这句话根据词组切割成一段一段,通过这一段一段再去数据库匹配内容就是搜索技术的核心所在。
所谓智取就是爬虫技术,通过服务端发请求到第三方网站(跨域只在浏览器上独有的特性,在服务端发请求就不受任何限制了),我这里以百度为例子,通过nodejs爬取内容,然后提取搜索出来的前十条里面的加红关键词。代码样例:
var http = require("http");
var express = require('express');
var app = express();
app.get('/search', index);
function index(req, res, next) {
let keyword = req.query.keywords;
if(keyword){
var search_url = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=';
http.get(search_url+encodeURI(keyword),function(_res){
let _data = '';
_res.on('data',(chunk) => _data += chunk.toString());
_res.on('end', () => {
let content = fn.getNode("#content_left",_data);//限定获取范围,减轻计算压力fn.getNode是封装的一个字符串里面取节点的函数,具体看http://www.mizuiren.com/477.html
let baiduKeywords = content.match(/([^/g);//在容器内匹配红色字关键词,其实就是*
let fanalKeywords = [];
if(baiduKeywords){
baiduKeywords.forEach(function(item){
let text = item.split("")[1].split("")[0];
fanalKeywords.indexOf(text) > -1 || fanalKeywords.push(text);//把关键词都放到fanalKeywords数组里,可用这个数组去数据库查数据了,这里省略
});
res.end(''+fanalKeywords.join(",")+'');//为了演示,直接把关键词输送到前端页面上
}else{
return next();
}
});
});
}else{
return next();
}
}
前端请求:/search?keywords=汶川大地震
分词结果:汶川大地震,汶川,地震,汶川地震,汶川县,大地震
前端请求:/search?keywords=我爱深圳
分词结果:我爱深圳,我爱深圳我爱深圳,深圳,我爱,深圳市,深圳市爱
前端请求:/search?keywords=秋叶网络博客
分词结果:秋叶网络博客,博客,秋叶,网络,秋叶博客
前端请求:/search?keywords=生活 志趣 爱
分词结果:志趣,生活,爱上,爱,爱生活爱
前端请求:/search?keywords=技术是对生活最完美的诠释
分词结果:对生活最好的诠释,对生活的诠释,完美诠释,生活,是对,生活最完美的诠释,技术,是最好的诠释,生活好,对生活,最完美的诠释,完美,是对生活最好的诠释,为,完美的,最好的生活,生活的,生活的最完美的诠释,对于,完美生活的诠释