加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

异构数据半小时实现搜索功能,一个系统搞定

发布时间:2019-08-30 02:32:49 所属栏目:建站 来源:峰明
导读:副标题#e# 背景 对于闲鱼这种处于高速增长期的部门来说,业务场景在快速膨胀,越来越多的业务数据对搜索能力有诉求。如果按照常规的方式为各个业务搭建独立搜索引擎服务,那么开发和维护的时间成本将是非常巨大的。能否只用一套搜索引擎系统支撑不同业务场

这里看起来通过无语义的定义方式支持了将多场景异构数据写入同一个引擎服务,但是对业务开发同学来说太不友好了。他们在业务开发中调用搜索服务时,期望的方式是自然的业务语义调用,如下面的代码片段:

  1. param.setTitle("iPhone6S"); 
  2. param.setSellerId(1234567L); 
  3. result = searchService.doSearch(param); 

但是现在字段没了语义,他们开发的复杂度大大提升,甚至时间一长会陷入难以维护的境地,因为业务代码写完1个月后没人会再记得代码中的“param.setDimaALongR1(1234567L)”是什么意思,这是按照用户id还是商品id查询?

虽然底层我们是将多个业务的数据放在一个引擎服务中,但是我们希望提供给业务开发同学(也就是我们这套系统的用户)的在线查询服务与独立搭建一套引擎的体验是一样的。所以,这里就需要有一个翻译层,通用搜索系统接收到的查询请求是“title=iPhone6S”,我们需要根据元数据注册中心的映射关系自动翻译成“dima_a_text_multilevel_r1=iPhone6S”后再向引擎发起搜索请求,并把引擎返回的数据DO中无语义字段翻译成源表的有语义字段。

pic4

可以看到,通过我们提供的搜索网关二方包,业务同学可以按照有语义的方式设置查询条件“param.setTitle("iPhone6S")”,同时自动化把引擎返回的无语义字段进行包装成为有语义的字段。业务同学完全觉察不到中间的转换过程,对他来说就像在使用一个为他单独搭建的搜索引擎服务一样。

每个业务接入方的源表字段定义都不同,只写一套搜索网关代码肯定无法实现上面的能力。我们的方案是,当用户在元数据注册中心曾经接入一个新业务后,后台自动化生成生成为业务定制的二方包代码,其中包含了查询入参、返回DO、查询服务接口。

还是以poi数据接入为例,poi业务域的开发同学在元数据注册中心说明了他需要按照poi_name做文本模糊匹配,需要根据poi_code做包含查询、不包含的精确查询。根据此登记信息,我们为用户自动生成poi业务场景专用的查询服务入参,每个入参都是一定的规则拼接而成,网关在线服务拿到此参数后可以根据命名规则翻译成具体的查询串。参数命名规则如下图:

pic5

入参Demo代码如下:

  1. public class UnisearchBiz1001SearchParam extends IdleUnisearchBaseSearchParams { 
  2.     private Set<Long> unisearch_includeCollection_prefix_poiCode; 
  3.     private Set<Long> unisearch_excludeCollection_prefix_poiCode; 
  4.     private String unisearch_keywords_poiName;     

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读