使用OpenSearch为应用提供搜索功能

版权声明:本文为农场老马原创文章,未经农场老马允许不得转载。 https://blog.csdn.net/a345017062/article/details/52668371

创业公司,一切从简,这里用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、自定义分词。一些特征行业的用语,在搜索意图中可能权重很大,但阿里云的通用分词库不一定能包含。

猜你喜欢

转载自blog.csdn.net/a345017062/article/details/52668371