2017搜索引擎优化规则(博主是一家开源规则引擎drools的应用案例分析及解决办法)
优采云 发布时间: 2022-02-05 17:052017搜索引擎优化规则(博主是一家开源规则引擎drools的应用案例分析及解决办法)
一、背景
博主是国内某大型保险公司的勤奋开发者。在日常工作中,他们需要接触大量的客户风控相关规则,面临很多差异化的逻辑,比如制度差异、销售人员差异、个体客户差异,甚至不同的销售平台也大相径庭,而且其中的逻辑复杂性只会比我们想象的更复杂和不舒服。这些业务规则经常被更改和更改。为了适应这样的需求,我们的 IT 业务系统应该能够以低成本快速更新。为了满足这样的需求,一般的做法是将业务规则的配置分开,以保持它们与业务系统的低耦合。目前,
二、计划响应
规则引擎是一个推理引擎,它根据已有的事实从规则知识库中匹配规则,对冲突的规则进行处理,并执行最终过滤后的规则。因此,规则引擎是人工智能(AI)研究领域的一部分,具有一定的选择判断、人工智能和丰富的知识。目前比较流行的规则引擎是商业规则引擎iLog和开源规则引擎drools。本文将详细介绍开源规则引擎drools,并分析一个保险行业的实际应用案例,让大家对开源规则流引擎有更深入的了解。
针对这些情况,我们提供成熟的业务规则处理解决方案,具体如下:
1.将业务逻辑与业务规则分离,集中管理业务规则。简化系统架构,方便后期维护。
2.编写规则文件实现业务规则,通过一个架子包存储所有规则文件。规则文件的逻辑结构清晰易懂。编写规则文件就像编写 SQL 脚本一样,语法简单易学。每条规则的逻辑独立,耦合度降低,可以快速准确定位问题。规则包可按版本控制,修改记录一目了然。在编辑环境中对规则进行单元测试很方便。
3.调用规则执行子系统得到业务规则推理结论。快速匹配算法用于规则推理,其匹配速度与规则数量无关,非常适合业务规则数量较多的场景。支持规则不间断更新,快速响应生产事件。方便规则包的整体测试。
4.规则通过规则管理子系统进行管理。方便查看规则包中的规则文件。修改业务规则执行中使用的动态参数,提供权限控制,保证数据安全。快速查询每个规则执行条目的执行结果,方便排查。
三、代码
举一个非常简单的例子,检查客户的索赔信息。客户的理赔ID已经在业务系统中提前获取。当需要验证时,需要通过调用drools相关的规则系统以及所有其他信息来验证规则:
package com.xxx.lcloud.rules.bean.vo;
import com.xxx.lcloud.frs.api.base.Translate;
import com.xxx.lcloud.rules.bean.vo.addition.InsurantAddition;
import com.xxx.lcloud.rules.bean.vo.base.Insurant;
import java.io.Serializable;
@Translate("被保人对象")
public class InsurantVO implements Serializable {
private static final long serialVersionUID = 1L;
private Insurant insurant = new Insurant();
private InsurantAddition insurantAddition = new InsurantAddition();
public String toString() {
return "InsurantVO [insurant=" + this.insurant + ", insurantAddition=" + this.insurantAddition + "]";
}
public InsurantVO() {
}
public Insurant getInsurant() {
return this.insurant;
}
public void setInsurant(Insurant insurant) {
this.insurant = insurant;
}
public InsurantAddition getInsurantAddition() {
return this.insurantAddition;
}
public void setInsurantAddition(InsurantAddition insurantAddition) {
this.insurantAddition = insurantAddition;
}
}
复制代码
package com.xxx.lcloud.rules.bean.vo.addition;xxx
import com.xxx.lcloud.frs.api.base.Translate;
import java.io.Serializable;
import java.math.BigDecimal;
@Translate("被保人附加信息")
public class InsurantAddition implements Serializable {
private static final long serialVersionUID = 1L;
@Translate("特殊理赔记录标识")
private Boolean specialClaimFlag;
public Boolean getSpecialClaimFlag() {
return this.specialClaimFlag;
}
public void setSpecialClaimFlag(Boolean specialClaimFlag) {
this.specialClaimFlag = specialClaimFlag;
}
}复制代码
规则文件:
package rules
import com.xxx.lcloud.rules.bean.vo.*;
import com.xxx.lcloud.rules.bean.vo.base.*;
import com.xxx.lcloud.rules.bean.vo.addition.*;
import com.xxx.lcloud.rules.bean.results.*
import com.xxx.lcloud.rcs.util.ClientType;
rule "insured"
dialect "mvel"
when
InsurantVO(
insurant != null,
insurantAddition != null,
insurant.mainInsurantFlag == true,
insurantAddition.specialClaimFlag == true,
$insurant :insurant
)
executionResult : ExecutionResult()
then
RuleFailureResult ruleFailureResult = new RuleFailureResult();
ruleFailureResult.setClientNo($insurant.getClientNo());
ruleFailureResult.setReasonType("02");
ruleFailureResult.setReasonDesc("客户存在理赔报案记录");
ruleFailureResult.setReasonFileCode(drools.getRule().getName());
executionResult.addRuleFailureResult(ruleFailureResult);
executionResult.setPassed(false);
end
复制代码
上述代码的语义:如果客户为主要被*敏*感*词*且有历史理赔记录,则需要将相应的业务规则返回业务系统,统一后续业务流程;
当然,面对更复杂更奇特的场景,drools可以帮我们解决问题,比如多条件判断,我们可以使用决策表,可以理解为一个小型的数据库表;
决策表又称判断表,是一种表格形式的图形化工具,适用于描述加工判断条件较多、条件相互结合、决策方案多样的情况. 一种描述复杂逻辑的精确而简洁的方式,将多个条件映射到满足这些条件时要执行的操作。但与传统编程语言中的控制语句不同,决策表可以清晰地表达多个独立条件和多个动作之间的直接联系。
目的:将相同逻辑、不同数据的规则组织成决策表
实现原理:决策表管理决策表头,一个表头可以有多组决策表数据。决策表数据可以关联多个业务子规则(通常是一个)
决策表管理用户生成的规则包中的 xls。决策表是从N条数据生成N条DRL规则,逻辑由表头生成;