智取百度、谷歌分词技术实现智能模糊搜索
作者:秋了秋 发表时间:2017年08月27日
众所周知,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是封装的一个字符串里面取节点的函数,具体看//netblog.cn/blog/477.html let baiduKeywords = content.match(/<em>([^<]+)<\/em>/g);//在容器内匹配红色字关键词,其实就是<em>*</em> let fanalKeywords = []; if(baiduKeywords){ baiduKeywords.forEach(function(item){ let text = item.split("<em>")[1].split("</em>")[0]; fanalKeywords.indexOf(text) > -1 || fanalKeywords.push(text);//把关键词都放到fanalKeywords数组里,可用这个数组去数据库查数据了,这里省略 }); res.end('<!DOCTYPE html><meta http-equiv="content-type" content="text/html;charset=utf-8"><html>'+fanalKeywords.join(",")+'</html>');//为了演示,直接把关键词输送到前端页面上 }else{ return next(); } }); }); }else{ return next(); } }
前端请求:/search?keywords=汶川大地震 分词结果:汶川大地震,汶川,地震,汶川地震,汶川县,大地震
前端请求:/search?keywords=我爱深圳 分词结果:我爱深圳,我爱深圳我爱深圳,深圳,我爱,深圳市,深圳市爱
前端请求:/search?keywords=秋叶网络博客 分词结果:秋叶网络博客,博客,秋叶,网络,秋叶博客
前端请求:/search?keywords=生活 志趣 爱 分词结果:志趣,生活,爱上,爱,爱生活爱
前端请求:/search?keywords=技术是对生活最完美的诠释 分词结果:对生活最好的诠释,对生活的诠释,完美诠释,生活,是对,生活最完美的诠释,技术,是最好的诠释,生活好,对生活,最完美的诠释,完美,是对生活最好的诠释,为,完美的,最好的生活,生活的,生活的最完美的诠释,对于,完美生活的诠释
9
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/489.html