火山引擎DataLeap的Data Catalog系统搜索实践 (上)
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
摘要
背景
功能要求
- 支持多种不同类型资产的搜索。目前系统中已经包含15+种数据源,可以分为几大类:数仓表比如Hive,看板,数据集,实时表,Topic,对象存储,分布式文件系统如LasFS等。带来的主要挑战是不同类型的资产,搜索的字段和权重有明显差异。
- 支持个性化。目前系统的用户遍布整个公司,角色涵盖数据工程师,数据分析师,产品经理,项目经理,销售和数据科学家等等,需要完成的数据工作任务差异也比较大,比如数据开发,数据治理,BI,数据分析和机器学习等等,因此个性化对Data Catalog的搜索尤为重要。
- 支持各种业务元数据的高级筛选。数据资产除了名称/别名/描述等字段,通常还会有一些业务元数据,如项目/业务域/负责人/负责人部门/标签/业务术语/生命周期状态等。通过支持指定业务元数据进行筛选,帮助用户减小搜索范围,更快搜到对应资产。
- 支持秒级的实时性。这里的实时性是指元数据的变更需要在秒级别反映到Data Catalog的搜索里,例如新建表需要在操作完成后1~2秒内即能搜到相应的表,删除表需要不再显示在搜索结果中。原因是用户新建或更新资产后通常会到我们的系统上查看相应的变更是否生效。用户手动在浏览器操作搜索的时间通常是秒级,超过这个时间会给用户带来困惑,降低整个Data Catalog的使用体验。
- 支持Google类似的搜索推荐(Type as you search)功能。搜索补全功能是搜索的一个导航功能,可以在用户键入内容时提示他们可以输入的相关内容,从而提高搜索精度。这个功能对响应速度有一定的要求,同时由于数据资产的特殊性,前缀相同的资产数量较多,因此也需要根据资产的热度进行一定的排序。
- 支持多租户。我们的系统不仅供公司内部使用,也提供公有云服务,因此支持多租户也是搜索的一个P0需求。
- 支持多语言。数据资产的名称/描述/标签/术语等需要支持多种语言,搜索的输入也可能是不同的语言,最常用的比如英文和中文。不同语言的分词,专有名词字典,文本特征等都会带来一些挑战。
个性化的综合搜索
架构
整体架构
- 实时导入。资产元数据变更时相应的平台发出实时变更消息,Data Catalog系统会消费变更消息,通过ingestion服务更新Elasticsearch中的文档,以此来达到搜索实时性秒级的需求。
- 离线导入。实时导入的过程中可能会遇到网络波动等不可控因素导致更新失败,因此需要定时的任务来检查和增量更新缺失的元数据。
- 用户行为记录。记录用户搜索点击日志,用来后续进行搜索的Badcase review和模型训练。这部分采用了前端埋点和服务端埋点结合的方式。前端埋点有成熟的内部框架,埋点数据流入离线数仓表,缺点是这部分数据要经过离线任务T+1才能使用。服务端埋点数据直接进入Elasticsearch,即时可用,同时在不支持前端埋点的场景(如ToB场景),可以成为主要的埋点数据收集方式。
- 线上搜索服务。提供搜索相关的线上服务,在后文详细解释这部分。
服务架构
- 搜索推荐服务(Type as you search)。搜索推荐服务对性能有一定的要求,通常来说补全的请求完成时间不能超过200ms,超过了用户就会有比较明显的延迟感。因此不能直接使用搜索接口实现,我们的系统里是基于Elasticsearch的Context suggester实现的。除此之外,还有两个问题需要重点考虑:
- 基于浏览的热度排序。页面上能够推荐的词数是有限的,通常是10个,在输入较短时,候选的推荐词通常会超过这个限制,因此通过资产的浏览热度来排序可以提高搜索推荐的准确率,改善用户的搜索体验。
- 时序问题。一次搜索过程中会有一连串的搜索推荐请求,服务端会并行的处理这些请求,通常更长的输入由于候选推荐词更少服务端响应反而更快,在用户输入较快的时候(比如连续的删除字符),前端先发出的请求可能会后返回,因此可能造成输入停止后推荐的词与输入不匹配。我们的方案是前端在根据服务端响应刷新数据时需要检查返回的输入与当前输入框内容是否一致,从而保持最终一致性。
- 聚合服务。聚合服务根据输入和筛选项提供搜索过程中需要用到的统计数字。例如用户希望知道搜索结果总共有多少条,每个筛选项下有多少个候选结果等统计信息,从而指导用户对搜索结果进行筛选,缩小搜索范围。同时,每个筛选项下的可选项需要根据输入和其它关联的筛选值动态生成,这部分也需要聚合服务提供。
- 搜索服务。支持核心的搜索过程,通过输入,返回对应的资产作为搜索结果。分为4个主要的部分。
- 预处理过程(Preprocess),主要包含对输入的预处理和用户信息的预处理。
- 对输入的预处理主要包括分词,停用,词性还原等基本的文本处理。分词主要包含英文分词和中文分词。英文分词需要处理-_等链接符分词,中文分词主要是用IK分词器。停用主要包含各种词如“的”,“了”,“我”和各种特殊符号“》〉?”等无意义的词语。词性还原是一把双刃剑,因为Data Catalog中的词语不同于一般的自然语言,有比较多的专有名词,比如live listing不应当被还原为live list,避免文本匹配的分数不准。同时这部分也包含对输入中的强pattern进行识别,如"数据库名.表名”等。
- 对用户信息的预处理。用户是否为超级用户,是否为API用户等,可以借此判断用户常搜索的资产类型或从未搜索的资产类型。
- 召回过程(Recall),负责通过输入和筛选项根据文本相关度从Elasticsearch查询一定数量的搜索候选结果,供下一步精排使用。召回过程需要保证用户期望的结果包含在召回结果中,否则后续排序优化都是徒劳。同时,召回的数量需要限制在合理的数值。主要原因有两点:一是排序靠后的搜索结果几乎没有用户会查看。二是召回过多的候选结果会影响性能,尤其是排序性能消耗比较大时。我们的召回主要分为两种方式:自然召回和强规则召回。
- 自然召回。对经过预处理的输入进行不同资产类型的召回,使用best field的策略,对资产的不同字段设置不同的权重,例如命中名称的资产应当比命中描述的资产优先级高。这里的权重通常根据经验设置,可以根据搜索结果的Badcase review得到,这个权重数值的精度要求不高,确保期望的结果能召回回来即可。
- 强规则召回。可以定制一些规则,作为自然召回的补充,涵盖精确表名的召回,或者从用户的常用资产列表进行召回。
除此之外,还需要做好多租户的隔离,避免当前租户的用户召回其它租户的资产。 - 精排过程(Rank),负责对召回的结果进行最终的排序。精排过程依次包含机器学习模型预测(Learning to rank)和基于规则调整两部分。Learning to rank部分详细介绍见后文。
- 机器学习模型在线预测,负责主要的排序工作。加载离线训练得到的PMML模型文件,提供预测功能。
- 基于强规则的调整,包含排序的各种兜底策略,比较常用的有:
- 精确匹配的结果排在第一位。
- 添加Tie-breaker,保证分数相同的结果多次搜索的排序一致。
- 后处理过程(Postprocess),对排好序的结果添加各种不影响顺序的后处理。例如:
- 权限检查,隐藏表设置。一些资产不希望被没有相关权限的用户查看详情,需要在搜索结果中设置相应字段并返回给前端。
- 高亮,对命中字段进行高亮标注,返回给前端。
火山引擎DataLeap的Data Catalog系统搜索实践 (上)的更多相关文章
- 火山引擎 DataLeap 的 Data Catalog 系统公有云实践
Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...
- 如何又快又好实现 Catalog 系统搜索能力?火山引擎 DataLeap 这样做
摘要 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理.资产.安全等全套数据中台建设,降低工作成本和数据维护成本.挖掘数据价 ...
- 火山引擎 DataLeap:揭秘字节跳动数据血缘架构演进之路
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维 ...
- 火山引擎 DataLeap:3 个关键步骤,复制字节跳动一站式数据治理经验
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理. ...
- 火山引擎 DataLeap:一家企业,数据体系要怎么搭建?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 导读:经过十多年的发展,数据治理在传统行业以及新兴互联网公司都已经产生落地实践.字节跳动也在探索一种分布式的数据治 ...
- 火山引擎DataLeap数据调度实例的 DAG 优化方案
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 实例 DAG 介绍 DataLeap 是火山引擎自研的一站式大数据中台解决方案,集数据集成.开发.运维.治理.资产管理能力 ...
- 字节跳动构建Data Catalog数据目录系统的实践(上)
作为数据目录产品,Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景,并服务于数据开发和数据治理的产品体系.本文介绍了字节跳动 Data ...
- 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化
背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...
- atitit.vod search doc.doc 点播系统搜索功能设计文档
atitit.vod search doc.doc 点播系统搜索功能设计文档 按键的enter事件1 Left rig事件1 Up down事件2 key_events.key_search = fu ...
- jQuery源代码解析(1)—— jq基础、data缓存系统
闲话 jquery 的源代码已经到了1.12.0版本号.据官网说1版本号和2版本号若无意外将不再更新,3版本号将做一个架构上大的调整.但预计能兼容IE6-8的.或许这已经是最后的样子了. 我学习jq的 ...
随机推荐
- 好用的解决PowerDesign中字体图片太小分辨率问题【已解决】
熟悉数据库设计的小伙伴可能都会用到一款名叫PowerDesign的工具 但是我在使用这款工具时候发现界面中的图标和文字都非常小,看的人眼睛疼,如下图 我刚开始修改了软件的字体大小,发现只是字稍微大了点 ...
- 线性表应用:魔术师发牌与拉丁(Latin)方阵(循环链表)
题目描述: 有黑桃1到13,13张牌,成某种顺序,魔术师可以从1开始数 ,数1,背面朝上的13张牌第一张就是1,然后放到桌面上,然后从1开始数,把第一张放在所有牌下面,数到2,翻开,就是2,再放到桌子 ...
- 线性代数导论MIT第一章中的知识点
线性代数知识点: 0.矩阵表 1.线性组合 2.向量与线性组合 3.线性组合 4.三维向量 平面向量(x, y)与3维空间的(x, y, 0)不相同! 二维空间的向量v具有两个分量v1与v2. v + ...
- 多项目git账户用户名和邮箱设置以及局部github代理
因为公司使用自建的gitlab服务器所以需要配置两个git账户分别用来访问公司仓库和自己的github仓库. 前言: 首先给大家梳理一下多用户名或者说多邮箱使用git的理解误区.我们需要知道的是我们的 ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- ClickHouse(16)ClickHouse日志引擎Log详细解析
日志引擎系列 这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的. 这系列的引擎有: StripeLog Log TinyLog 共同属性 引擎: 数据存储在磁盘上. 写入时将数据追 ...
- 架构师的知行合一(内容由AI的全文生成,满分100分我打99分)
大型架构是怎么来的 随着科技的不断发展,越来越多的企业和组织开始意识到数字化转型的重要性.为了更好地适应市场的变化,满足客户的需求,提高企业的竞争力,大型架构成为了企业和组织不可或缺的一部分.那么,大 ...
- 常用sql语句(不定时更新)
--查询数据库所有表名与表说明 select a.name tableName, b.value tableComment from sysobjects a LEFT JOIN sys.extend ...
- com.alibaba.nacos.api.exception.NacosException
具体异常如下: com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel ...
- zookeeper JavaApi 创建节点
import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import ...