2017搜索引擎优化规则(博主是一家开源规则引擎drools的应用案例分析及解决办法)

优采云 发布时间: 2022-02-05 17:05

  2017搜索引擎优化规则(博主是一家开源规则引擎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规则,逻辑由表头生成;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线