用户画像系统标签数据持久化存储到MPP类型数据库,需要借助画像标签构建筛选查询。前端UI提供交互操作界面自由组合标签筛选条件,画像规则引擎基于组合设计模式生成树结构,通过树提供脚本生成规则校验,以及画像规则树条件节点通过策略模式生成数据库筛选SQL脚本,然后通过SQL脚本即可查询数据库获取数据。
用户画像标签涉及数值类型、文本类型、时间类型和级联类型条件自由组合,需要考虑实现扩展性和实现复杂度,不经过规范设计可能导致代码实现逻辑复杂,代码臃肿扩展性也就不言而喻。
一、实现方案
本次发明目的是使用委派设计模式打造一套用户画像规则生成方法,主要流程涉及前端UI交互、数据协议以及驱动引擎模块生成实现。
二、前端UI交互
如下图案例,前端UI交互通过"加条件"和"加条件组"按钮任意位置灵活组合筛选条件,根据与或非组装筛选逻辑内容。
"加条件"按钮只能追加当前层级筛选条件,比如"基础信息/注册日期"+相对日期+最近一周。"加条件组"可以其后追加一个与或非+至少2个条件的条件组,比如("基础信息/经营状态"+精确匹配 +在营)且("基础信息/常驻地"+匹配+广东省/广州市、广西省)。

三、数据协议
根据前端UI交互展示,通过树结构进一步抽象就如下图所示。根据树结构特性,树结构叶子节点不能包含子节点,规定树结构叶子结点为筛选条件节点。然而,树结构非叶子节点可以包含子节点,规定为与或非逻辑节点,定义为关系逻辑节点,可以看出关系逻辑节点可以包含任意关系逻辑节点和筛选条件节点。

前后端数据通过JSON格式数据进行交互,所以协议就按照JSON进行约定。通过树结构约定,筛选条件节点需要包含筛选条件标签信息、筛选条件逻辑和筛选条件内容。其次,为了减少前后端交互信息查询,添加额外字段进行前端回显。
json
{
"tagCode": "TAG1", // 标签代码
"tagName": "注册日期", // 标签名字
"tagType": "number", // 标签类型
"tagLogic": ["relative","last_near_day"], // 筛选条件逻辑, 可以包含多个
"tagValues": ["10"], // 筛选条件
"tagValueLabels": ["10"] // 前端回显值
}
其次,根据约定与或非逻辑节点用于进行子条件组合,也是通过JSON进行约定。
json
{
"relationLogic": "or", // 关系逻辑, 与(and), 或(or)
"groups": [] // 条件组
}
因此,按照约定上面案例根据两种节点进行组合,数据协议内容如下。
json
{
"relationLogic": "or",
"groups": [
{
"tagCode": "TAG1",
"tagName": "注册日期",
"tagType": "date",
"tagLogic": ["relative","last_near_day"],
"tagValues": [],
"tagValueLabels": []
},
{
"relationLogic": "and",
"groups": [
{
"tagCode": "TAG2",
"tagName": "经营状态",
"tagType": "text",
"tagLogic": ["in"],
"tagValues": ["在营"],
"tagValueLabels": ["在营"]
},
{
"tagCode": "TAG3",
"tagName": "常驻地",
"tagType": "region",
"tagLogic": ["in"],
"tagValues": [
{"level":1, values:["001000"]},
{"level":2, values:["002001"]}
],
"tagValueLabels": [
{"level":1, values:["广西省"]},
{"level":2, values:["广州市"]}
]
}
]
}
]
}
四、画像规则引擎
前端UI交互实现筛选条件自由组合得到规定数据JSON结构,使用Ajax传递给画像规则引擎进行解析。画像规则引擎使用递归+循环解析树结构,使用组合设计模式构建规则树,然后基于规则树提供检查节点数据是否符合要求,以及基于规则树使用策略和委托模式生成查询脚本。
4.1 画像规则树构建
根据前端UI交互案例获取画像规则JSON协议数据,然后采用组合设计模式抽象规则树结构,通过画像规则驱动(PortaitRuleDriver)持有规则树(node)和数据维度(dims),关系逻辑节点通过组数组(groupNodes)持有多个子节点,筛选条件节点仅包含筛选条件信息。
那么,通过分析发现一个永恒公式:筛选条件SQL = select 维度 from 标签表 where 条件
。维度可以通过addDim
方法灵活添加,筛选条件通过Node节点生成,然后进行组装即可获得满足要求的少选SQL。

完成树结构形式定义,接下来解析JSON数据协议构建这棵规则树,构建流程主要使用递归+循环逻辑,主要流程如下。

4.2 规则树生成查询语句
通过画像规则JSON协议数据构建画像规则驱动,接下来需要通过画像规则驱动生成查询语句,首先调用规则树生成规则筛选条件,其次和用户客群标识进行组装生成查询语句。

4.3 生成筛选节点条件
筛选条件生成流程,主要包括数据类型转换和生成筛选条件,最终返回生成的筛选条件SQL
案例:注册日期+条件(相对时间,最近10天)
json
{
"tagCode": "TAG1", // 标签代码
"tagName": "注册日期", // 标签名字
"tagType": "date", // 标签类型
"tagLogic": ["relative","last_near_day"], // 筛选条件逻辑, 可以包含多个
"tagValues": ["10"], // 筛选条件
"tagValueLabels": ["10"] // 前端回显值
}
首先,根据标签编码查询可以获取数据表字段,"tagCode"="TAG1"
查询得到字段为reg_date
字段 其次,根据筛选条件进行数据类型转换,如果当前时间为**2024-07-18**
,那么"注册日期"根据"tagLogic"=["relative","last_near_day"]
和tagValues=["10"]
内容即可生成['2024-07-08', '2024-07-18']
条件数据。
最后,根据筛选条件关系进行筛选条件生成,也就是"注册日期"根据转换数据['2024-07-08', '2024-07-18']
和"tagLogic"=["relative","last_near_day"]
生成SQL查询条件reg_date between '2024-07-08'and '2024-07-18'
。
五、总结与思考
根据需求与神策竞品内容可以清晰发现需要的演进方向,然后进行扩展性设计,满足业务灵活进行标签交并差操作。