使用OpenSearch为应用提供搜索功能
来源:互联网 发布:网络红歌2016 编辑:程序博客网 时间:2024/06/05 02:11
创业公司,一切从简,这里用OpenSearch搭建一个健康科普文章的搜索服务,为应用提供搜索功能。
说到健康科普,当属我一直关注的丁香医生了,几千篇正牌医生针对自己擅长的领域写出来的文章,权威性很高。不像百度出来的一片片盗版文档,毫无可信度可言。老码农作为资深鼻炎患者,感受颇深。
所以这次就用这些健康科普文章来做次实验。
声明
丁香医生的科普文章是经过高价约稿,专家组评审最后才发布出来的,产生成本很高,是禁止任何形式的转载的!
这里的数据只做自己研究之用,后面demo中的搜索结果出来之后,如果要看文章详情,我也都跳转到丁香医生的文章详情h5页面。
数据源
数据爬取
先把丁香医生的几千篇健康科普文章爬下来,都是结构化的数据,包含文章的title、content、time、author、org等信息,dump到阿里云的ODPS上。
为了避免给丁香医生服务器造成压力,设置了爬取间隔。
这里本来还有一大段介绍爬取过程的技术细节,后来都删除了,以免给丁香医生的正常服务造成不必要的困扰。
同步到OpenSearch
可以直接设置OpenSearch的数据源为ODPS数据表,同时进行索引,完全傻瓜式操作。
第一次要做全量索引,时间稍长,花了10+分钟的样子,同样的数据量,比自己的单机Lucene全量索引要慢很多。云平台的速度优势要靠大数据量来验证。
这里针对索引的数据段做一下说明。
1、文章内容content、标题title两个字段使用中文基础分词,使用OpenSearch的默认中文词表切词。
2、作者名称author、作者所属组织org使用中文单字分词。如北京航空总医院,被分词为:北、京、航、空、总、医、院。增加召回率。
测试
进行“搜索测试”,输入query测试返回结果
集成到项目
前端调用
OpenSearch,提供的接入方式比较多,我是通过tomcat为微信公众号提供服务,用的java SDK。SDK的demo很简单。
//设置阿里云账户的主机、访问密钥等。CloudsearchClient client = new CloudsearchClient(accesskey, secret , host, opts, KeyTypeEnum.ALIYUN);CloudsearchSearch search = new CloudsearchSearch(client);//在OpenSearch建立的应用名称。search.addIndex("dxy");search.setQueryString(query);//返回的结构化数据格式,可以有xml、json等。search.setFormat("json");//搜索请求。String result = search.search();//解析搜索结果 JSONObject json = JSON.parseObject(result); if ("OK".equals(json.getString("status"))){ JSONArray itemArray = json.getJSONObject("result").getJSONArray("items"); if (itemArray == null || itemArray.size() == 0){ return "无结果"; }else { String content = ""; for (int i = 0;i<itemArray.size() && i<5; i++){ String column_id=itemArray.getJSONObject(i).getString("column_id"); String title=itemArray.getJSONObject(i).getString("title"); String author=itemArray.getJSONObject(i).getString("author"); String org=itemArray.getJSONObject(i).getString("org"); System.out.print(column_id + "|" + title+"|"+author+"|"+org); System.out.println(); content += "<a href=\"http://dxy.com/column/"+column_id+"\"\">" + title+"</a>\n作者:"+author+"\n单位:"+org+"\n\n"; } return content; } }else { return "无结果"; }
这里是最终的微信公众号查询界面
由于丁香医生的健康科普文章禁止任何形式的转载,搜索结果的点击均跳转到了丁香医生的H5页面。
数据对接
OpenSearch中对数据RDS和ODPS两种数据源的接入很方便,如果项目中已经使用了RDS或ODPS,只接从数据源导入,选择一下字段映射好了。另外,也可以上传json形式的结构化数据。
附加功能
对搜索服务来说,除了搜索这个最核心的任务之外,还有很多应用层面的事情要做。如,热词、搜索提示等,用起来很方便。
优化
OpenSearch的默认配置只能满足一般性需要。具体业务的使用还是需要做做优化。
1、用户查询的分析。停用词过滤,同义词转化等,OpenSearch上面简单的添加规则就可以完成。
2、搜索结果排序。粗排时相关性因子的选择,细排的规则细化等。
3、自定义分词。一些特征行业的用语,在搜索意图中可能权重很大,但阿里云的通用分词库不一定能包含。
- 使用OpenSearch为应用提供搜索功能
- 为Android系统或你的应用提供搜索功能--开始使用搜索功能
- 为Android系统或你的应用提供搜索功能
- opensearch 使用
- 为应用添加搜索功能
- 为应用提供文件的拖放功能
- 为Android应用添加搜索功能
- 优化OpenSearch的搜索结果
- Android提供语音搜索功能
- 昨日关注:开放式搜索聚合 OpenSearch
- OpenSearch:轻松构建大数据搜索服务
- 阿里云开放搜索案例(opensearch )
- 为你的输入框或者搜索框提供语音输入功能(超酷超装逼超折腾的功能)
- 为iOS应用提供技术支持
- 给select标签提供搜索功能
- 使用 flask_whooshalchemyplus jieba 为 Flask 添加 搜索 功能
- 创建一个提供搜索功能的搜索类(可运行)
- Taghelp_为自定义标签提供附属功能
- iOS应用崩溃日志分析
- Unity3d面试6 DontDestroyOnLoad();PlayerPrefs;协同程序;游戏框架;Unity中播放视频;LOD技术
- 【Core Java Volume 6】集合算法--二分查找法
- IOS - UIBezierPath精讲
- CUDA(1)
- 使用OpenSearch为应用提供搜索功能
- 基于http 和 https的文件下载
- nmg_common_lighting.glinc
- 开发模式及框架梳理
- 新浪微博分享以及回调可能会遇到的一些问题
- 平面坐标转大地坐标(经纬度)
- Sqlite3数据库用法总结:
- mysql 开启root用户远程连接
- 2016 是时候结束校招了!