返回顶部
首页 > 资讯 > 数据库 >PostgreSQL中怎么实时干预搜索排序
  • 790
分享到

PostgreSQL中怎么实时干预搜索排序

2024-04-02 19:04:59 790人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关postgresql中怎么实时干预搜索排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Postgresql是一个历史悠久的数据库,最早

这期内容当中小编将会给大家带来有关postgresql中怎么实时干预搜索排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Postgresql是一个历史悠久的数据库,最早由加州大学伯克利分校的Michael Stonebraker教授领导设计,具备与oracle类似的功能、性能、架构以及稳定性。

阿里云HybridDB for PostgreSQL,提供大规模并行处理(MPP)数据仓库服务, 支持多核并行计算、向量计算、图计算、JSON,jsONB全文检索。

PostgreSQL中怎么实时干预搜索排序

3.2 系统架构

PostgreSQL高效的并行处理能力,基于JSON格式数据合并能力以及Notify实时消息能力,给我们提供了具体实现思路。因此基于上文提到业务挑战,我们梳理了相关实现方案。

PostgreSQL中怎么实时干预搜索排序

仔细分析整体方案,归纳起来涉及的方面有:

  • 异构数据源接入

  • 归一化服务

  • 数据合并策略

  • 实时分数重算

异构数据源接入

闲鱼商品相关的数据非常丰富,有各种异构数据源,如全量的离线商品数据,实时商品变更数据,各种算法维度数据等,在实现上可通过阿里云大数据平台,binlog监听工具等进行统一处理。

PostgreSQL中怎么实时干预搜索排序

如上图所示,所有异构数据源都按照统一格式,通过异步消息,输入到归一化服务,该方案的优点是不管全量数据还是增量数据都统一走消息服务,简化接入流程,同时通过消息中间层进行解耦,提高稳定性。

归一化服务

归一化服务接收上游异构数据源消息,通过数据校验模块、数据补全模块、标准格式转换模块、数据监控模块为下游输送正确的数据。

  • 数据校验模 如下图所示,数据源结合元数据中心进行字段级别的校验,如字段名称,数据类型,数据范围、默认值等,引入元数据中心最大优势是可以细粒度的控制数据源,防止脏数据、不需要的数据污染下游。

PostgreSQL中怎么实时干预搜索排序

  • 数据补全模块 数据源通常需要实时补全一些数据干预指标,如用户编辑商品,需实时分析打标是否有黄图,商品价格预测等,整个干预流程要以pipeline的形式,暴露扩展点,允许插入干预能力。

PostgreSQL中怎么实时干预搜索排序

  • 标准格式转换模块 标准格式转换模块将数据源统一按标准的格式转换成JSON结构,便于下游统一数据合并。

  • 数据监控模块 数据监控模块记录数据源的每一条数据以及异常数据记录,并将数据投递到监控系统,监控每个异构数据源异常数据,流量异常情况,第一时间发现并恢复问题。

数据合并策略

PostgreSQL中怎么实时干预搜索排序

数据合并策略主要包括基于时间戳的数据合开和数据变更通知两个先后处理流程,在数据合并流程会遇到一个核心问题,即如何快速有效的解决每个字段的冲突合并,基于时间戳统一merge。这里首先会涉及到数据存储结构,参考如下表设计结构:

create table Test (id int8 primary key,   -- 商品IDatt jsonb   -- 商品属性);

属性设计为JSON,JSON里面是K-V的属性对,如下属性结构示例,V里面是数组,包含K的值以及这对属性的最后更新时间,更新时间用于merge update,当属性发生变化时才更新,没有发生变化时,不更新。这种设计优点:

  • 字段级别细粒度merge,保证最小集数据实时性

  • 高扩展性,表不需要增减字段

属性结构示例

{"count": [100, "2017-01-01 10:10:00"], "price": [8880, "2018-01-04 10:10:12"], "newatt": [120, "2017-01-01 12:22:00"]}

定义完存储结构, 接下来利用PostgreSQL的JSON处理能力进行数据merge,参考如下merge udf 伪代码:

create or replace function merge_json(jsonb, jsonb) returns jsonb as $$
  select jsonb_object_agg(key,value) from (
  select 
    coalesce(a.key, b.key) as key, 
    case 
    when 
    coalesce(jsonb_array_element(a.value,1)::text::timestamp, '1970-01-01'::timestamp) 
    > 
    coalesce(jsonb_array_element(b.value,1)::text::timestamp, '1970-01-01'::timestamp) 
    then a.value
    else b.value
    end
  from jsonb_each($1) a full outer join jsonb_each($2) b using (key)
  ) t;
$$ language sql strict ;

定义完merge方法后,我们在数据源有数据变更时直接调用。

insert into a values
(1, '{"price":[1000, "2019-01-01 10:10:12"], "newatt": ["hello", "2018-01-01"]}')
on conflict (id)
do update set
att = merge_json(a.att, excluded.att) 
where
a.att <> merge_json(a.att, excluded.att);

从上面可以看出当商品ID出现冲突时,会调用merge_json 进行数据合并,至此数据合并流程完成,接下来需要将合并结果实时通知下游,可以利用PostgreSQL的触发品和Notify机制来处理。

触发器设计

//触发器要执行的udf
CREATE OR REPLACE FUNCTION notify1() returns trigger AS $function$
declare  
begin
     perfORM pg_notify(  
       'a',    -- 异步消息通道名字  
       format('CLASS:notify, ID:%s, ATT:%s', NEW.id, NEW.att)   -- 消息内容  
     );  
  return null;  
end
$function$ language plpgsql strict;
//创建触发器
create trigger tg1 after insert or update on Test for each row execute procedure notify1();

可以看出当数据插入或更新会触发trigger 执行nofity1 函数创建异步nofity消息,并向指定的通道发送通知,下游应用可通过jdbc监听相应的通道,接收消息,进行后续实时打分流程,参考如下伪代码:

this.pGConn = conn.unwrap(org.postgresql.PGConnection.class);
Statement stmt = conn.createStatement();
stmt.execute("LISTEN a");
stmt.close();

org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
if (notifications != null) {
    for (int i=0; i < notifications.length; i++) {
        System.out.println("Got notification: " + notifications[i].getName());
    }
}

另外PostgreSQL并发处理性能非常高效,绑定触发器后会增加PostgreSQL的数据写入时长,但是压测结果来看,依然能够满足我们的业务写入性能要求,

以1000万数据测试结果为例:

PostgreSQL中怎么实时干预搜索排序

数据实时打分干预搜索

PostgreSQL中怎么实时干预搜索排序

服务层在监听到Notify消息,解析消息数据,通过规则引擎对各指标权重进行分数重算,计算综合分数,打到搜索tag表,搜索引擎实时监测tag表,将综合分数dump到搜索引擎,实时干扰排序结果。

上述就是小编为大家分享的PostgreSQL中怎么实时干预搜索排序了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL中怎么实时干预搜索排序

本文链接: https://lsjlt.com/news/58766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PostgreSQL中怎么实时干预搜索排序
    这期内容当中小编将会给大家带来有关PostgreSQL中怎么实时干预搜索排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。PostgreSQL是一个历史悠久的数据库,最早...
    99+
    2024-04-02
  • vue怎么实现搜索筛选、降序排序数据
    这篇文章主要介绍“vue怎么实现搜索筛选、降序排序数据”,在日常操作中,相信很多人在vue怎么实现搜索筛选、降序排序数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么实现搜索筛选、降序排序数据”的疑...
    99+
    2023-07-04
  • PostgreSQL中怎么实现全文搜索功能
    要在PostgreSQL中实现全文搜索功能,可以使用全文搜索扩展模块。全文搜索扩展模块提供了一种更高级的搜索方式,不仅可以搜索特定关...
    99+
    2024-04-09
    PostgreSQL
  • 怎么使用JS排序和搜索算法
    这篇文章主要介绍“怎么使用JS排序和搜索算法”,在日常操作中,相信很多人在怎么使用JS排序和搜索算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用JS排序和搜索算法”...
    99+
    2024-04-02
  • 怎么在python中实现顺序搜索
    怎么在python中实现顺序搜索?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前...
    99+
    2023-06-14
  • C#中怎么利用正则表达式实现预搜索
    这篇文章将为大家详细讲解有关C#中怎么利用正则表达式实现预搜索,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#正则表达式之正向预搜索声明格式:正声明 “(=&hellip;)”,负...
    99+
    2023-06-17
  • 微信小程序怎么实现搜索输入框带搜索记录
    本篇内容主要讲解“微信小程序怎么实现搜索输入框带搜索记录”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序怎么实现搜索输入框带搜索记录”吧!  在最近的项目里有一个需求,就是需要一个带搜索...
    99+
    2023-06-26
  • vue怎么实现实时搜索显示功能
    这篇“vue怎么实现实时搜索显示功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现实时搜索显示功能”文章吧。效...
    99+
    2023-06-30
  • Android项目类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现
    最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现。 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录。在EditTe...
    99+
    2022-06-06
    自动 淘宝 电商 监听 事件 排序 软键盘 Android
  • C++怎么实现在旋转有序数组中搜索
    这篇文章主要介绍了C++怎么实现在旋转有序数组中搜索的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现在旋转有序数组中搜索文章都会有所收获,下面我们一起来看看吧。Search in Rotated S...
    99+
    2023-06-19
  • 微信小程序中的搜索功能怎么实现
    微信小程序中的搜索功能可以通过以下步骤实现: 在小程序的页面中添加一个搜索框组件(如或),用户可以在这个搜索框中输入关键字。 ...
    99+
    2024-04-09
    微信小程序
  • MyBatis怎么实现按时间排序
    本篇内容介绍了“MyBatis怎么实现按时间排序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyBatis按时间排序测试代码Activit...
    99+
    2023-06-29
  • 怎么用Vue+java实现时间段的搜索
    本文小编为大家详细介绍“怎么用Vue+java实现时间段的搜索”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Vue+java实现时间段的搜索”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效果如图:标红...
    99+
    2023-07-02
  • MySQL中怎么实现模糊搜索
    本篇文章给大家分享的是有关MySQL中怎么实现模糊搜索,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。01 引言MySQL根据不同的应用场景,支...
    99+
    2024-04-02
  • JavaScript中怎么实现全文搜索
    这篇文章将为大家详细讲解有关JavaScript中怎么实现全文搜索,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。相关性对每一个搜索查询,我们很容易给每个文档...
    99+
    2024-04-02
  • PHP中怎么实现搜索数组
    这篇文章给大家介绍PHP中怎么实现搜索数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。PHP语言中的数组应用是一个需要不断学习的知识点。首先我们要知道如何进行PHP搜索数组,得知道你所搜索的是一个数组,而不是其他的数...
    99+
    2023-06-17
  • List<T>搜索和排序中的方法有什么不不同
    本篇内容介绍了“List<T>搜索和排序中的方法有什么不不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在.NET 1.1时,...
    99+
    2023-06-17
  • 微信小程序中怎么实现一个搜索框组件
    今天就跟大家聊聊有关微信小程序中怎么实现一个搜索框组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。search.wxml<view ...
    99+
    2024-04-02
  • MyBatis Plus分页时怎么实现排序
    本篇内容主要讲解“MyBatis Plus分页时怎么实现排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MyBatis Plus分页时怎么实现排序”吧!简介分页时排序的方法后端OrderIte...
    99+
    2023-06-29
  • Android中怎么实现poi搜索功能
    Android中怎么实现poi搜索功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。第一,就是设置背景的drawable为纯白色导致键盘弹出的时候,recyclerview...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作