Есть ли какая-то причина, почему слишком дорого позволить серверу БД проверять это?Кажется немного чрезмерным дублировать алгоритм синтаксического анализа ts_query на клиенте.
Если проблема состоит в том, что вы не хотите, чтобы он пытался выполнить весь запрос (который предположительно будет включать в себя доступ к таблице) каждый раз, когда онпроверяет, вы можете использовать входные данные в меньшем запросе, просто в псевдокоде (который может выглядеть немного как Python, но это просто совпадение):
is_valid_query(input):
try:
execute("SELECT ts_query($1)", input);
return True
except DatabaseError:
return False
Что касается фразировки, то, вероятно, проще всего искать посначала не фразированный запрос (с использованием индексов), затем отфильтруйте те, у которых есть фраза.Это может быть сделано на стороне сервера или на стороне клиента.В зависимости от анализируемого языка, может быть проще всего создать простое регулярное выражение фразы, имеющее дело с повторяющимися пробелами или другими игнорируемыми символами.
- Поиск to_tsquery ('HELLO | (I & LIKE & CATS)'), возвращая список документов, которые слабо совпадают.
- В клиенте отфильтруйте его по тем, которые соответствуют регулярному выражению "HELLO | (I \ s + LIKE \ s + CATS)".
Недостатком является то, что вам нужен дополнительный код для перевода вашего запроса в соответствующий более свободный запрос, а затем для перевода его в регулярное выражение.
Наконец, может быть подходомв PostgreSQL сделать правильный поиск фразы, используя позиции лексемы, которые хранятся в ts_vectors.Я предполагаю, что поиск по фразе - одно из предполагаемых применений, но я не смог найти пример этого в моем кратком поиске.В нижней части http://linuxgazette.net/164/sephton.html есть раздел, по крайней мере.