当前位置: 首页 > 编程日记 > 正文

华为开发者大会HDC.Cloud技术探秘:云搜索服务技术实践

搜索是一个古老的技术,从互联网发展的第一天开始,搜索技术就绽放出了惊人的社会和经济价值。随着信息社会快速发展,数据呈爆炸式增长,搜索技术通过数据收集与处理,满足信息共享与快速检索的需求。基于搜索技术,更是缔造了谷歌、百度、雅虎等一批知名企业。

搜索也是一个蓬勃发展技术,它串联起了问答、地图、小程序等各式各样新的应用形态。最近十几年间,也应用到了更早前并无直接关联的IT运维等领域。更是通过技术融合推动了AI、NoSQL、OLAP等相关技术的发展。

日前,华为开发者大会HDC.Cloud DevRunLive开发者技术沙龙上,华为云专家做了关于“云搜索服务技术实践”的技术演讲。本文为大家介绍业界流行的搜索应用场景,开源Elasticsearch的应用,以及华为云搜索服务在此基础上的一些增强。

一、什么是搜索?

搜索行为的基本流程

从技术上来看,搜索指的是:依据不同类型数据的条件组合,筛选出符合条件的记录(或称文档),并依照某种排序规则进行TopN的选择,最后进行呈现。

具体的过程,如上图所示。我们在生活中遇到的各种类型数据,像新闻文档、电话号码、年龄、体重、地图坐标等,在搜索系统各种会映射成不同类型的索引,比如文本一类的数据被映射成倒排表索引,数字一类的数据被映射成KD-Tree索引。还有一类特殊的数据,像图片、视频等多媒体信息,他们不能直接被表达为索引,而是通过机器学习表达为一个个向量数据,然后存储为搜索系统中的向量索引。

各种数据转换为索引后,我们就可以通过不同的条件描述组合来进行搜索了。通过索引来搜索相比一条条数据的过滤,通常速度会快好几个数量级,从而快速筛选出符合条件的数据条目。

最后,当筛选出来的数据条目非常多的时候,人难以一次阅读过来,还有有一个排序的过程,比如按照是否最新、猜测是否最符合搜索目的等方法挑选出其中的Top N条,最后进行呈现。

上述是从技术角度来阐述什么是搜索,从实际应用来看,更加容易体会搜索的形态以及价值。

搜索的部分应用

从业务上来讲,搜索是一种灵活提取/组织企业知识的手段,面向客户或企业自身都有很强的应用价值。在泛互联网/泛政府/大中小企业都有广泛的应用。

二、企业如何构筑自己的搜索系统?

如果从头开始构筑自己的搜索系统,会是一个非常耗费时间与资源的事情,因为搜索技术确实比较复杂。就比如前面说过的表达文本索引的倒排表,就会有FST、PForDelta、Skip List等等很多底层数据结构以及工程实践要实现。再加上行列存储、数值索引、向量索引、分布式等其他方面的内容,投入的时间和资源会是一个惊人的数字。对于不是以提供搜索引擎为主业的企业来说,最好的选择是从一个优秀的开源软件开始,比如Elasticsearch。

Elasticsearch,简称ES

Elasticsearch拥有着强大的功能,从它开始搭建搜索系统能够节省大量的时间与资源。

当然使用开源软件也不是一个一劳永逸的事情。如果是一个单机的Demo,很容易。但是一旦上到生产系统,事情就变得不那么简单了。

生产环境下,事情变得复杂

在生产环境中,要考虑集群化以应对大量的数据与请求,还要考虑业务连续性所要求的可靠性以及极端情况下可恢复性,防止恶意操作或者误操作的安全准备,以及业务的扩张带来的对应资源添加等等。这些问题都需要大量的经验来支撑操作,这使得企业不得不投入额外的精力来操作这些不属于主业务的事务。

为了帮助企业更好的完成上述任务,华为云推出了云搜索业务,能够大幅简化生产环境下Elasticsearch的维护工作量,并且在部分ES原本处理较薄弱的地方,进行了增强。

华为云搜索,为生产环境充分考虑

华为云为了让企业在生产环境上的搜索系统更易于构筑,做了如下几个方面的工作:

√兼容性:100% 兼容Elasticsearch APIs,支持5.x到7.x多个版本

√易用性:分钟级集群创建、扩容,一键式备份与恢复,7*24看护

√安全性:支持优秀的分权分域,底层磁盘加密

√高可用:扩容节点、磁盘业务不中断,更新词库业务不中断

√可靠性:支持跨AZ冗余配置,自动化的增量备份

√高性能:慢报表自动加速,费时降低百倍,集成向量索引,多媒体检索时延低至ms级

√低成本:存算分离的架构,长时间数据存留成本降至20%

前面的5条,可以笼统的归结为生产环境上的必要条件。这里重点聊一下最后两条中的内容:向量索引、存算分离、报表加速。

三、向量索引

向量搜索主要是为了多媒体内容检索准备的。一个搜索请求假设带上一张图片,这个图片会被事先转换为一个特征向量(比如人脸图片典型特征就是一个256维的Float向量),这个向量会被送入搜索系统与其他存档的向量进行比对,如果两个向量的距离越近(欧式距离、余弦距离等),那么就意味着原始的图片约相似,从而有可能被搜索出来。由于可以对多媒体进行搜索,向量的搜索技术被大量用于拍照选商品、人脸匹配、高速路口车辆寻迹等场景。

Elasticsearch也有向量搜索的能力,叫做DenseVector,但是这个方式有一定的缺陷。

ES的向量处理方式

如上图所示,进行一个联合条件检索,比如“梅观路口”AND <某汽车照片向量>这样的条件来检索出现在梅观路口某车辆历史经过的记录时, 开源ES的做法是先通过倒排索引快速找到符合“梅观路口”的记录,再一条条和查询的小汽车向量进行比较,找出TopN比如前20条向量距离最近的。这样一来,如果符合“梅观路口”的记录有一亿条,就要比较一亿次,效率很低。

华为云搜索采用向量索引来解决这个问题。

华为云搜索的向量处理方式

如上图所示,主要有两个突破点,第一个突破点是如何对向量采用一种合理的索引编码方式,能够带来远小于O(N)的时间复杂度。我们的方式是采用HNSW的编码方式,带来近似O(Log)的时间复杂度。第二个突破点,是如何与其他类型的索引协同工作,我们通过改写Lucene和ES的代码,在底层新增了一种数据结构,支持与其他索引进行互通,通过向量索引快速锁定搜索范围从而减小其他条件的索引范围。最后的总体效果就是,哪怕是上亿的数据,得出结果也只要数十毫秒。

四、存算分离

如文章开头所讲,近十几年来,搜索因为优良的灵活度,被逐步用于企业的日志定位,指标运营运维任务中,替换了原始的Log文件Ctrl+F和Excel表格运维的操作方式。ES有很大一部分的实际应用都是针对这个场景。对于重度依赖IT系统的企业来讲,日志与指标的产生是源源不断的。但是这些数据的价值随着时间的推移,会逐步降低,但价值却不会完全消失。对于企业来讲,这很两难,如果长时间保留这些数据,使用开源ES的成本相当高昂,如果仅仅保留最近几天的数据,那么万一需要回溯一个疑难杂症或者复盘一个运营事件,需要用到上周甚至是上月的数据怎么办呢?

华为云给出的方案是存算分离。

通过四个方法解决了其中的四个关键点:

  1. 依照时序数据不会修改的特征,数据分类为热数据与冷数据,热数据可写可搜,冷数据可搜不可写。这样解决了时序数据特征到数据处理模型的映射。

  2. 热转冷时,将数据转移到对象存储,由于对象存储使用的是纠删码存储,冗余与有效载荷的比值远小于1,大幅节约了原先由于多副本带来的存储成本。

  3. 计算节点内还是保留多副本概念,用于维护可靠性,但是都仅仅是指向同一份对象存储,不会重复存储。

  4. 对于冷数据,不会长时间维持全部的元数据以及Cache,而是自建内存管理机制,尽可能的少用内存,实现小马拉大车,少量节点带动大量数据。

通过上述方式,实现了日志数据保留成本下降至20%,同时数据容量相比优化前提升12倍。

五、报表加速

为了统计PV/UV曲线或者请求的平均时延曲线等运营运维的数据用于企业业务或者IT管理的决策参考,通常IT部门会引入ES来根据原始的指标数据来制作报表。但是这个方式在统计跨度稍大的范围时,就很容易出现报表很慢或者OOM的情况。

华为云采用了报表加速技术解决。

华为云搜索报表加速方式

如上图,这个方案分为两个部分,上面一部分是Rollup。Rollup的原理并不复杂,把时间按照一定的粒度比如5分钟进行分割,将里面的数据按照配置好的聚合语句预先进行一遍聚合计算。那么后续再来报表请求的时候,直接基于预先聚合好的粗粒度数据计算,可以大幅提升计算效能。这个方案ES的非开源包XPack中有实现,华为云搜索也采用了自己的实现。

更贴近客户也是更独特的部分是图中的下半部分。由于ES中Rollup是一套独立的API,用户需要自己进行预聚合的操作与任务维护。华为云搜索则是通过判断用户的慢日志,来自动化的协助用户决策,是否需要进行加速,并生成中间数据辅助计算。优化前后,用户的业务不需要进行任何修改,在已有的接口之上便可获得加速能力。

最后得到的效果是,基本所有加速的报表提速都在100倍以上。

欢迎扫码试用华为云搜索服务

点击阅读原文,回看华为开发者大会HDC.Cloud DevRunLive开发者技术沙龙演讲直播。

相关文章:

从今天开始,自己做SEO。

1.购买了一点黑链。开始优化之路。 2.更改了关键词&#xff0c;描述。 3.整理了友情链接。 4.购买了VPS服务器&#xff1a;点击查看 转载于:https://www.cnblogs.com/zq535228/archive/2010/06/09/1754986.html

Elasticsearch2.2.0配置文件说明

为什么80%的码农都做不了架构师&#xff1f;>>> 官方配置文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html 配置详解 # ---------------------------------- Cluster &#xff08;集群配置&#xff09;----------------------…

各种类型的字节数

int类型比较特殊&#xff0c;具体的字节数同机器字长和编译器有关。如果要保证移植性&#xff0c;尽量用__int16 __int32 __int64吧&#xff0c;或者自己typedef int INT32一下。 C、C标准中只规定了某种类型的最小字节数&#xff08;防止溢出&#xff09; 64位指的是cpu通用寄…

154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告...

曾经&#xff0c;软件吞噬世界。现在&#xff0c;AI 吞噬软件。作者 | 屠敏数据 | 杨阳、刘学涛可视化&策划 | 唐小引出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;从三年前年薪 25 万只是白菜价&#xff0c;到去年华为以年薪最高达 201 万招揽顶尖应届毕业生…

中国移动用户能不能用WCDMA网?(世界杯与通信2)

到南非有移动的用户也有联通的用户&#xff0c;联通的网络快这是肯定的&#xff0c;不过联通的通话价格也比移动的高&#xff0c;就有人希望拿着移动的号去南非&#xff0c;最好也能享受WCDMA的网络速度&#xff0c;这样就是两全其美了&#xff0c;对于这个问题&#xff0c;在国…

平安陆金所-点金计划,简直是骗子行为。

陆金所点金计划&#xff0c;让人防不胜防。平安保险&#xff0c;骗子中的教练。 转载于:https://www.cnblogs.com/hthf/p/5205921.html

深度分析define预处理指令

#define语句 预处理 宏替换 --以上出自《C语言入门经典(第四版)》 #和## --出自《C语言程序设计&#xff1a;现代方法(第2版)》 #undef取消定义 --以上出自《21天学通C语言(第6版)》

建立YUM服务器CENTOS

1 &#xff0c;YUM Client:要保证安装有如下软件包&#xff1a;yum-3.2.19-18.el5.centosyum-metadata-parser-1.1.2-2.el52 &#xff0c;YUM Server&#xff1a;要保证安装有如下软件包&#xff1a;yum-3.2.19-18.el5.centosyum-metadata-parser-1.1.2-2.el5yum-fastestmirror…

数据库设计的10个最佳实践

作者 | Emily Williamson译者 | 孙薇&#xff0c;责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;数据库是应用及计算机的核心元素&#xff0c;负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行&#xff0c;总有一…

十进制转化为十六进制分割高低位

2019独角兽企业重金招聘Python工程师标准>>> 将十进制1000&#xff0c;转化为十六进制&#xff0c;则为0x03E8,如果得到高低位&#xff0c;high0x03,low0xE8 BYTE high;BYTE low;int temp_data1nWeightValue;highBYTE(temp_data1 >>8);int temp_data2nWeightV…

Nginx内存池--pool代码抽取(链表套路)

ngx_palloc.c文件 ngx_palloc_large_hm是自己写的代码没有nginx原版的ngx_palloc_large写的好&#xff0c;细节要品味才会发现nginx的美 nginx链表的套路&#xff0c;正好是两种插入“从前插”和“从后插”&#xff0c;有些许差别 #include <stdio.h> #include <std…

阿里再次主办大数据世界杯, KDD Cup2020正式开赛

记者从国际计算机科学顶会ACM SIGKDD官网获悉&#xff0c;KDD Cup 2020今日正式开赛&#xff0c;本届比赛由阿里巴巴达摩院主办。随即&#xff0c;阿里公布了认知智能、曝光偏差两大赛题方向&#xff0c;并向全球参赛者开放最大规模的商品多模态数据集。阿里也是两次举办该赛事…

grep 正则表达式

grep 正则表达式来源:http://blog.rednet.cn/user1/213546/archives/2007/35795.html以下为整理的grep 正则表达式的大部分功能,详细参见man grep: 要用好grep这个工具&#xff0c;其实就是要写好正则表达式&#xff0c;所以这里不对grep的所有功能进行实例讲解&#xff0c;只列…

Mybatis缓存机制理解及配置

2019独角兽企业重金招聘Python工程师标准>>> 1. Ehcache EHCache是来自sourceforge&#xff08;http://ehcache.sourceforge.net/&#xff09;的开源项目&#xff0c;也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存&#xff0c;支持LRU、…

浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)

首先&#xff0c;先稍微了解系统调用的概念&#xff1a; 系统调用&#xff0c;英文名system call&#xff0c;每个操作系统都在内核里有一些内建的函数库&#xff0c;这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核&#xff0c;调用相应的的内核函数完成所需的…

Android之ListActivity(一):布局与数据绑定

Android中的列表&#xff0c;当然也可以用ListView来完成所需要的功能&#xff0c;用法是一样的。 废话不说&#xff0c;来关键的。 LiveActivity本身继承了关于List操作的众多接口&#xff0c;我们可以方便的重写这些操作中需要的方法来实现自己需要的功能。 如果要用ListActi…

用于单图像超分辨率的对偶回归网络,达到最新SOTA | CVPR 2020

作者 | Yong Guo, Jian Chen等译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;通过学习从低分辨率&#xff08;LR&#xff09;图像到高分辨率&#xff08;HR&#xff09;图像之间的非线性映射函数&#xff0c;深度神经网络在图像超分辨率&#xff08;SR&a…

老生常谈,joomla wordpress drupal,你该选择哪个CMS?

本人从事Joomla建站多年&#xff0c;给客户建站都是用Joomla&#xff0c;所以我会极力推荐你选择Joomla&#xff1f; No No No&#xff0c;这样未免太Hard sale了。 虽然这是一个会经常被提到的问题&#xff0c;网上也有不少优秀的答案&#xff0c;但我还是想把自己的想法跟大家…

利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配

TCMalloc的全称为Thread-Caching Malloc&#xff0c;是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Malloc相比&#xff0c;TCMalloc库在内存分配效率和速度上要高很多&#xff0c;这在很大程度上提高了服务器在高并发情况下的性能&#xff0c;从而降低…

Silverlight Analytics Framework(开源分析框架)

Silverlight Analytics Framework是由微软官方推出的WPF/Silverlight扩展Web分析框架.该框架与10余家第三方分析服务结合&#xff0c;使应用可以跟踪程序如何使用的详细情况&#xff0c;为用户提供诸如可用性和视频质量等细节分析。用户可以了解到这些应用软件的使用细节&#…

Python炫技操作:条件语句的七种写法

作者 | 写代码的明哥来源 | Python编程时光有的人说 Python 入门容易&#xff0c;但是精通难的语言&#xff0c;这点我非常赞同。Python 语言里有许多&#xff08;而且是越来越多&#xff09;的高级特性&#xff0c;是 Python 发烧友们非常喜欢的。在这些人的眼里&#xff0c;能…

puppet(1.7-2.1)

puppet配置模块(一)模块是puppet的最大单元&#xff0c;模块里面有类&#xff0c;类下面有资源。同步文件、远程执行命令、cron等叫做资源&#xff0c;都是通过模块来实现的。下面我们来定义一个模块&#xff1a;在服务端上做如下操作&#xff1a;mkdir /etc/puppet/modules/te…

ldconfig动态链接库管理以及修改ld.so.conf.d

将"/usr/local/lib"加入配置文件重 执行命令&#xff1a; #echo "/usr/local/lib" >> /etc/ld.so.conf 然后再直接执行&#xff1a; #ldconfig /etc/ld.so.conf.d/* 或/etc/ld.so.conf和ldconfig. /etc/ld.so.conf.d/*目录下的文件和/etc/ld.so.co…

深度残差收缩网络:借助注意力机制实现特征的软阈值化

作者 | 哈尔滨工业大学&#xff08;威海&#xff09;讲师 赵明航本文解读了一种新的深度注意力算法&#xff0c;即深度残差收缩网络&#xff08;Deep Residual Shrinkage Network&#xff09;。从功能上讲&#xff0c;深度残差收缩网络是一种面向强噪声或者高度冗余数据的特征学…

如何在同一台电脑上多个账户同时登陆MSN

一般情况下&#xff0c;在一台电脑上只能启动一个msn进程&#xff0c;所以当想多个账户在同一台电脑上同时登陆时&#xff0c;就无法实现了。我们可以使用MSNShell来实现多个账户的同时登陆。MSNShell下载地址&#xff1a;http://www.msnshell.netMSNShell系统要求&#xff1a;…

LINUX动态链接库的创建与使用

大家都知道&#xff0c;在 WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件&#xff0c;DLL即Dynamic Link Library)。这种动态链接库&#xff0c;和静态函数库不同&#xff0c;它里面的函数并不是执行程序本身的一部分&#xff0c;而是根据执行程序需要按需装入&#xff…

多模态商品推荐与认知智能背后的数学

在数据挖掘领域&#xff0c;KDD CUP是最有影响力、最高水平的国际顶级赛事&#xff0c;堪称大数据的“奥运会”。阿里巴巴作为KDD CUP 2020的主办方为参赛团队准备了两大赛题&#xff0c;第一道是关于“电商场景的多模态商品推荐”&#xff0c;下面就这一道题目从认知智能与数学…

Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo

安装VS2010 首先安装VS2010&#xff0c;安装过程请参考文章&#xff1a;http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html。创建第一个MVC2.0程序 新建一个asp.net MVC2.0网站程序&#xff0c;如下图&#xff1a;提示是否新建单元测试工程&#xff0c;选择创建Uni…

one pragmatical sqlhelper

namespace ConsoleApplication2 {using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;public class SqlHelper{/// <summary>/// 连接字符串/// </summa…

LINUX动态链接库高级应用

在《 LINUX下动态链接库的创建与应用》 一文中,我介绍了LINUX动态链接库的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函 数,装入指定的动态链接库中指定的函数,然后加以执行.程序中使用很少的动态函数时,这样的做法尚可.如果程序需要调…