Vespa YQL `matches` 查询中特殊字符的转义规则咨询
Vespa YQL
matches 查询中特殊字符的转义规则咨询 我试了好多次才发现,Vespa的matches查询里需要转义的特殊字符,比官方文档里提到的引号"和反斜杠\要多。像*这种字符,居然需要双重转义才行。
目前我用的是下面这段Python正则替换代码来处理:
def escape_yql(text: str) -> str: subtext = re.sub(r'[\"]', r"\\\g<0>", text) return re.sub(r'[*]', r"\\\\\g<0>", subtext)
我把它用在构建YQL语句里,用来实现精确匹配的正则搜索,用法如下:
yql = f'select * from sources * where testfield matches \"^{escape_yql(text)}$\"'
不过让我有点困惑的是,不管是单转义还是双转义括号()都会导致查询失败,错误信息类似这样:
Could not create query from YQL: query:L1:58 no viable alternative
一般情况下不对括号转义不会报错,但如果左右括号数量不相等的话,问题就显现出来了——这时候系统会明确解析这些括号,比如下面这个查询:
select * from sources * where name matches \"^TestText))$\" and bcp47_language matches \"^en$\" limit 1
对应的错误信息是:
"yql: [{'code': 4, 'summary': 'Invalid query parameter', 'message': \"Could not create query from YQL: Unmatched closing ')' near index 8\n^TestText))$\n ^\"}]"
所以我想知道,其他正则特殊字符里,哪些需要单转义、双转义,或者有别的处理方式,还是根本不需要转义?
目前我打算绕开这个问题,在schema里新增一个字段,把testfield的内容复制一份,并且设置exact属性。不过我觉得搞清楚这个转义规则还是很重要的,有没有朋友能给点建议?
备注:内容来源于stack exchange,提问作者Stephen Gadd
相关产品推荐
相关产品推荐

