syb_product_filter 的 kind='char' 有两行(- 和 #),RuleSet.Match 逐条 strings.Contains,命中即返回——是或关系:
syb_product_filter
kind='char'
-
#
RuleSet.Match
strings.Contains
for i, x := range r.Chars { if strings.Contains(n, x.NormalizedKeyword) { return &r.Chars[i] } }
线上最近一次完整同步(syb_sync_run id=541,2026-09-15 16:06):
syb_sync_run
char_filter_skipped
因为 - 先判且命中即返回,那 148 条是含 # 但不含 - 的。
结构过滤合并为一条,语义为「variationSku 同时包含 - 和 # 才过滤」。
[必须] 已向用户说明影响:每次同步至少多放行 148 条(含 # 不含 - 那批),再加上 384 条里只含 - 的部分——后者无法从现有计数推出,因为被过滤的明细不入库。按每小时一次同步计,是每天数千条的量级变化。用户于 2026-09-15 确认按此实施。
[必须]
保留 kind='char',改为一行,keyword 存需要同时具备的字符集合(-#),匹配改为「集合中每个字符都必须出现」。
keyword
-#
char
strings.Contains(n, keyword)
strings.ContainsRune(n, r)
FirstOrCreate
kind='keyword'
后端规则变更 + 现有界面的文案调整。文案改动属于显示文案,执行最小界面检查。
go build ./... 与 go test ./app/goauto/sybproductfilter/... ./app/goauto/sybimport/...;Web 构建。
go build ./...
go test ./app/goauto/sybproductfilter/... ./app/goauto/sybimport/...
last_hit_count
结构过滤的判据属于业务规则,需更新对应 Wiki 页面中 #269 的描述。
No dependencies set.
The note is not visible to the blocked user.
原始需求
当前行为
syb_product_filter的kind='char'有两行(-和#),RuleSet.Match逐条strings.Contains,命中即返回——是或关系:线上最近一次完整同步(
syb_sync_runid=541,2026-09-15 16:06):-#char_filter_skipped因为
-先判且命中即返回,那 148 条是含#但不含-的。目标行为
结构过滤合并为一条,语义为「variationSku 同时包含
-和#才过滤」。-不含##不含-[必须]已向用户说明影响:每次同步至少多放行 148 条(含#不含-那批),再加上 384 条里只含-的部分——后者无法从现有计数推出,因为被过滤的明细不入库。按每小时一次同步计,是每天数千条的量级变化。用户于 2026-09-15 确认按此实施。方案
保留
kind='char',改为一行,keyword存需要同时具备的字符集合(-#),匹配改为「集合中每个字符都必须出现」。RuleSet.Match对char规则由strings.Contains(n, keyword)改为「keyword 的每个 rune 都strings.ContainsRune(n, r)」。keyword对char类型的含义由「子串」变为「必需字符集合」,需在代码注释与界面文案中写清。keyword类型不变,仍是子串匹配。char,写入一行-#;沿用 #269 的FirstOrCreate/幂等写法,重复执行不产生重复行。非目标
kind='keyword')的匹配方式。设计证据
后端规则变更 + 现有界面的文案调整。文案改动属于显示文案,执行最小界面检查。
验收
-和#的 variationSku 被过滤。-的放行。#的放行。kind='char'恰好一行且为-#;重复执行不产生重复行。验证
go build ./...与go test ./app/goauto/sybproductfilter/... ./app/goauto/sybimport/...;Web 构建。风险
char:这两行的last_hit_count历史计数会丢失。回退方式为再写一条迁移恢复两行。文档影响
结构过滤的判据属于业务规则,需更新对应 Wiki 页面中 #269 的描述。