Sphinx 中可能出现 RegexP_Filter 错误?

Possible RegexP_Filter error in Sphinx?

我正在做这样的事情:

所以对于上面的 HI,我会这样做:

regexp_filter = (HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_

我使用 \2 因为根据

https://regex101.com/r/uZ4zK1/1

第二个捕获组为我提供了所需的前导 space,因此该术语(理论上)变为

upper_HI Manufacturing

我的问题是进程 "HI" 中的某处仅被识别为 "Hi"。

以下任何一项与索引记录相匹配:

select  Name from idx_Test WHERE (MATCH('"upper_Hi Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_Hi" "Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_Hi"'))

以下都失败了:

select  Name from idx_Test WHERE (MATCH('"upper_HI Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_HI" "Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_HI"'))

即使我明确强制 "HI" in:

regexp_filter = (HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_HI

我得到了同样的错误。

如果你想匹配 (HI|Hi|hi) 那么你可以显式定义每个,或者更好的是添加一个标志来触发不区分大小写的匹配:(?i)

regexp_filter = (?i)(HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_

请记住 regex_filter 也应用于 查询

所以你应该搜索

select Name from idx_Test WHERE MATCH('"HI Manufacturing"')

您不需要自己应用转换。事实上,在您的示例中,它会被 'double' 应用,一次由您应用,一次由狮身人面像应用,将其变成 MATCH('"upper_upper_hi manufacturing"') 这就是它不匹配的原因。

大小写混合 'Hi' 类的作品,因为正则表达式过滤器不会触发。请记住正则表达式是区分大小写的。

它仍然匹配,因为charset_table使匹配不区分大小写。