Elasticsearch:如何用查询或聚合判定报销申请的状态及置信度?
基于Elasticsearch判定报销申请合格性的方案
核心思路
通过检索同品类下语义相似的历史报销记录,统计不同审核状态的加权占比,来判定新申请的合格性并计算置信度——越相似的历史记录权重越高,结果更精准。
步骤1:确认索引映射(可选但推荐)
确保description字段为text类型(支持分词和相似性匹配),category和status为keyword类型(支持精确过滤和聚合)。如果已有索引,可通过以下命令查看映射:
GET claim/_mapping
步骤2:相似性查询+状态聚合
使用以下Elasticsearch查询,获取新申请(category: office_equipment,description: wooden desk)的相似历史记录,并聚合不同状态的加权评分总和:
POST claim/_search { "size": 10, // 取Top10最相似的历史记录,平衡精度和性能 "query": { "bool": { "must": [ { "match": { "description": "wooden desk" // 匹配描述的语义相似性 } } ], "filter": [ { "term": { "category": "office_equipment" // 限定同一品类 } } ] } }, "aggs": { "status_summary": { "terms": { "field": "status.keyword", "size": 2 }, "aggs": { "total_relevance_score": { "sum": { "script": "_score" // 聚合该状态下所有匹配文档的相关性评分总和 } } } } } }
如果需要更精准的语义相似匹配,也可以用more_like_this查询替代match:
"must": [ { "more_like_this": { "fields": ["description"], "like": "wooden desk", "min_term_freq": 1, "max_query_terms": 12 } } ]
步骤3:计算结果与置信度
根据查询返回的聚合结果,按以下逻辑计算最终状态和置信度:
- 无匹配历史记录:返回
直接进入人工处理。status: "pending" confidence: 0 - 有匹配记录:
- 提取聚合结果中
approved和rejected的加权评分总和(total_relevance_score),记为score_approved和score_rejected - 总加权分:
total_score = score_approved + score_rejected - 若
score_approved > score_rejected:status: "approved" confidence: score_approved / total_score - 若
score_rejected > score_approved:status: "rejected" confidence: score_rejected / total_score - 若两者相等(概率极低):返回置信度0,进入人工处理。
- 提取聚合结果中
示例结果(针对你的新申请)
现有历史数据中,wooden desk与stand up desk语义高度相似,查询会优先匹配到这条approved记录,同时其他office_equipment类的approved记录也会有一定匹配度,ps4几乎不会被匹配到。最终计算结果大致为:
status: "approved" confidence: 0.92
人工处理触发规则
当置信度低于设定阈值(比如<0.6)时,无论状态如何,都强制进入人工审核。
内容的提问来源于stack exchange,提问作者bigpotato
相关产品推荐
相关产品推荐

