跳到主要内容

Memory Match(记忆匹配)

询问候选者是否匹配已记住的任何东西,并按答案分支。

用途

拿一个候选者与命名记忆里每条存活条目比对。任一条目满足条件,节点路由 matched;否则 notMatched

条件是完整表达式,所以匹配可用容差、范围和字符串操作——不只是相等。

何时用

  • 冷却守卫:"最近处理过这个目标吗?"
  • 去重:"这条目已在已处理清单里了吗?"
  • 邻近检查:"有已记条目靠近这个位置吗?"

何时不用

  • 读一个已知的键——那是查找,不是匹配。
  • 比较两个变量——用 If
  • 在任何东西被记住之前——记忆是空的,每个候选都路由 notMatched

前提

一个记忆名称和一个条件表达式。记忆必须由 Runtime Memory 节点写入。

如何运行

过期条目不被考虑——你写入时设的 TTL 正是让守卫自清理的东西。

设置

设置类型范围备注
Memorystring1–100 字符必填。 要搜的仓库
Expressionstring≤ 1000 字符条件,引用 {{item.<字段>}}
Conditions列表1–50 行旧的无代码构建器
Logic选择and / or旧行如何组合

引用受测条目

表达式里,被测条目暴露为 item

{{item.x_coordinate}}
{{item.status}}

你的候选值来自普通流程变量。

容差匹配——本节点存在的理由

对真实屏幕数据,精确相等几乎无用。表达式引擎让你表达接近

(abs({{current_x}} - {{item.x_coordinate}}) <= 1) && (abs({{current_y}} - {{item.y_coordinate}}) <= 1)

读作:"有已记条目在我现在位置一格之内吗?"

正是它让这个模式在 OCR 读坐标漂一像素、或目标上报位置在帧间轻微移动时仍然可用。

没有作用域设置

Memory Match 跨作用域读取——它不接受作用域参数。旧节点可能携带 scope 字段;它被容忍并忽略。

仔细核对记忆名称

既然本节点没有作用域选择器,记忆名称就是它与你写入的纽带。打错就意味着空记忆和永久的 notMatched

端口

端口走它的时机必接
matched有存活条目满足条件——宽容
notMatched无条目满足——宽容
Fatal配置无效否——永不被走

两个分支都可选。留一个不接会优雅结束该路径——一种合法的"到此为止"选择——但通常你两个都想接。

基础示例

这条目处理过了吗?

  • Memory:processed_items
  • Expression:{{item.id}} == {{current_id}}

matched → 跳过;notMatched → 处理它。

实际示例——完整的冷却守卫

注意顺序:先匹配,后记住。在匹配之前记住会一直匹配到自己的条目。

也注意读取的 Failure 路径——识别不了目标时,照样处理通常比永远跳过工作更安全。

高级示例——状态过滤器

条目可带任意字段,所以匹配能表达业务规则:

{{item.account}} == {{current_account}} && {{item.status}} == "pending"

matched 意为"该账号已有待办"——所以别再排队。

最佳实践

  • 总是先匹配再记住。 否则候选者匹配到自己。
  • 对任何源自屏幕的东西用容差,而非精确相等。
  • 字段名在 Runtime Memory 写入与此表达式之间保持一致。
  • 两个端口都接。 宽容不代表你该留空。
  • 单独处理"识别不了"的情况——读不出的候选与未匹配的候选不同。
  • 先用空记忆测试。 一切都该路由 notMatched

性能笔记

  • 表达式对每条存活条目求值一次。500 条的记忆意味着每次调用 500 次求值。
  • 用现实的 TTL 保持记忆小——过期条目不被求值,所以 TTL 是主要成本阀门。
  • persistshared 触 SQLite;run 作用域在内存。
  • 把 Memory Match 放进大记忆上的紧循环,是让这个节点变贵的唯一方式。

内存笔记

  • 节点只读条目;从不写。它无法让记忆增长。
  • 存活条目为求值而物化,所以很大的记忆在匹配时有真实工作集成本。

常见错误

错误后果修复
在匹配前记住一直匹配到自己的条目先匹配
字段名打错从不命中与写入保持同名
记忆名打错空记忆、永久 notMatched核对名称
对 OCR 值用精确相等错过几乎相同的条目abs() 的容差
两个端口都不接路径悄悄结束两个都接
指望有作用域选择器没有记忆名就是纽带

故障排查

从不匹配。 三个常见原因:记忆名与写入不符、字段名不符,或条目已过期。先查写入的 TTL 和作用域。

总是匹配。 节点跑在 remember 之后,候选者匹配到自己。调换顺序。

匹配到错的条目。 容差太松。收紧比较。

节点走 Fatal。 表达式无效或引用了不可用的东西。

FAQ

它搜特定作用域吗? 不——跨作用域读。记忆名标识仓库。

它告诉我匹配到哪一条吗? 当前模型只路由 matched/notMatched。检查前把你需要的存进变量。

过期条目算数吗? 不。只有存活条目被求值。

能同时用 AND 和 OR 吗? 能,在表达式里——&&||

相关节点

相关页面