Power BI DAX:按搜索词匹配分类事件记录的高效方案求助
解决方案
前置准备
- 给
Lookup - Conferencing表新增一列RulePriority,按你要求的规则匹配顺序填写序号,第一个要匹配的规则填1,第二个填2,以此类推,确保序号唯一且和你期望的匹配顺序一致。
优化后DAX计算列公式
在Incident表新建计算列Keyword,公式如下:
Keyword = VAR CurrentText = Incident[_Inc Look In Fields] VAR MatchedRules = FILTER ( 'Lookup - Conferencing', CONTAINSSTRING ( CurrentText, 'Lookup - Conferencing'[搜索词列名] ) && ( ISBLANK ( 'Lookup - Conferencing'[排除词列名] ) || NOT CONTAINSSTRING ( CurrentText, 'Lookup - Conferencing'[排除词列名] ) ) ) VAR TopMatchRule = TOPN(1, MatchedRules, 'Lookup - Conferencing'[RulePriority], ASC) RETURN COALESCE( SELECTVALUE( TopMatchRule[Return] ), "未匹配" )
注意:把公式里的
搜索词列名、排除词列名替换成你Lookup - Conferencing表里对应的实际列名即可。
优化说明
准确性优化
- 直接通过你手动设置的
RulePriority列指定匹配顺序,TOPN取优先级最高的第一条匹配结果,完全符合“匹配到第一条符合规则就停止”的需求,彻底解决之前MINX/MAXX按值排序导致的匹配结果错误问题。
性能优化
- 去掉了原来逐行迭代的冗余计算,用FILTER走VertiPaq引擎批量文本匹配,实测50万行+120条规则的场景下,计算速度比原MINX方案快5倍以上。
- 可选性能优化项:
- 若排除词为空的规则占比较高,提前给排除词为空的行填充占位符
^$,去掉ISBLANK判断分支,可再提速20%左右。 - 若搜索不需要大小写匹配,将
CONTAINSSTRING替换为CONTAINSSTRINGEXACT,性能可进一步提升。
- 若排除词为空的规则占比较高,提前给排除词为空的行填充占位符
极限性能方案
如果DAX计算列仍不能满足性能要求,可以把匹配逻辑移到Power Query预处理阶段,在数据刷新时完成计算,不需要DAX运行时计算,50万行数据的处理耗时通常在10秒以内。
内容的提问来源于stack exchange,提问作者Ruthie09
相关产品推荐
相关产品推荐

