проверка to_tsquery () - PullRequest
       4

проверка to_tsquery ()

4 голосов
/ 18 июля 2011

В настоящее время я занимаюсь разработкой веб-сайта, который позволяет выполнять поиск в PostgreSQL. В базе данных поиск работает с to_tsquery(), и я пытаюсь найти способ проверить ввод перед его отправкой в ​​виде запроса.

Кроме этого, я также пытаюсь добавить возможность формулировки, так что если кто-то ищет HELLO | "I LIKE CATS", он найдет результаты только с "hello" или всей фразой "i like cats" (в отличие от I & LIKE & CATS найдет вам статьи, которые имеют все 3 слова, независимо от того, где они могут появиться).

1 Ответ

1 голос
/ 13 апреля 2012

Есть ли какая-то причина, почему слишком дорого позволить серверу БД проверять это?Кажется немного чрезмерным дублировать алгоритм синтаксического анализа ts_query на клиенте.

Если проблема состоит в том, что вы не хотите, чтобы он пытался выполнить весь запрос (который предположительно будет включать в себя доступ к таблице) каждый раз, когда онпроверяет, вы можете использовать входные данные в меньшем запросе, просто в псевдокоде (который может выглядеть немного как Python, но это просто совпадение):

is_valid_query(input):
    try:
        execute("SELECT ts_query($1)", input); 
        return True
    except DatabaseError:
        return False

Что касается фразировки, то, вероятно, проще всего искать посначала не фразированный запрос (с использованием индексов), затем отфильтруйте те, у которых есть фраза.Это может быть сделано на стороне сервера или на стороне клиента.В зависимости от анализируемого языка, может быть проще всего создать простое регулярное выражение фразы, имеющее дело с повторяющимися пробелами или другими игнорируемыми символами.

  1. Поиск to_tsquery ('HELLO | (I & LIKE & CATS)'), возвращая список документов, которые слабо совпадают.
  2. В клиенте отфильтруйте его по тем, которые соответствуют регулярному выражению "HELLO | (I \ s + LIKE \ s + CATS)".

Недостатком является то, что вам нужен дополнительный код для перевода вашего запроса в соответствующий более свободный запрос, а затем для перевода его в регулярное выражение.

Наконец, может быть подходомв PostgreSQL сделать правильный поиск фразы, используя позиции лексемы, которые хранятся в ts_vectors.Я предполагаю, что поиск по фразе - одно из предполагаемых применений, но я не смог найти пример этого в моем кратком поиске.В нижней части http://linuxgazette.net/164/sephton.html есть раздел, по крайней мере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...