Методом проб и ошибок я обнаружил, что специальные символы, требующие escape-символов в запросе Vespa match, включают в себя больше, чем просто символы кавычки " и обратной косой черты \, отмеченные на https: //docs.vespa.ai/en/reference/query-language-reference.html. Другим (например, *) требуется двойное-экранирование.
< п>На данный момент Я использую следующую замену регулярных выражений Python:
Код: Выделить всё
def escape_yql(text: str) -> str:
subtext = re.sub(r'[\\"]', r"\\\g", text)
return re.sub(r'[*]', r"\\\\\g", subtext)
Он используется при построении YQL для поиска по регулярному выражению с
точным совпадением, например:
Код: Выделить всё
yql = f'select * from sources * where testfield matches "^{escape_yql(text)}$"'
Однако, что сбивает с толку (по крайней мере для меня), одиночное или двойное экранирование круглых скобок () приводит к сбою с сообщением в форме «Could не создавать запрос из YQL: query:L1:58 нет подходящей альтернативы". Ошибка обычно не возникает, если к этим символам не применяется escape-символ, но не в том случае, если количество открывающих и закрывающих скобок не одинаково: в этом случае становится очевидным, что они на самом деле анализируются, с сообщением вроде этого: /p>
Код: Выделить всё
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 ^\"}]"
Интересно, какой из других специальных символов регулярного выражения может потребовать одинарного или двойного экранирования, чего-то другого или вообще никакого?
По разным причинам Я собираюсь обойти эту проблему, создав дополнительное поле в моей схеме, в котором копия моего токенизированного тестового поля имеет точное свойство, но, тем не менее, кажется важным разобраться в этом. Есть предложения, пожалуйста?
Подробнее здесь:
https://stackoverflow.com/questions/793 ... ches-query