Sphinx 中可能出现 RegexP_Filter 错误?
Possible RegexP_Filter error in Sphinx?
我正在做这样的事情:
- 将也是单词的大写首字母缩略词(例如 HI=Hawaii)替换为 upper_$Acronym 以供将来搜索。
- 在模式匹配上这样做。
所以对于上面的 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使匹配不区分大小写。
我正在做这样的事情:
- 将也是单词的大写首字母缩略词(例如 HI=Hawaii)替换为 upper_$Acronym 以供将来搜索。
- 在模式匹配上这样做。
所以对于上面的 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使匹配不区分大小写。