Ошибка добавления строки с двоеточием ":" в тип данных "tsvector" - PullRequest
0 голосов
/ 14 февраля 2019

В моей базе данных PostgreSQL 11 есть столбец «name» с типом данных «tsvector» для реализации полнотекстового поиска.

Но когда я пытаюсь добавить в этот столбец запись, содержащуюдвоеточие «:», возникает ошибка:

Exception in thread Thread-10:
Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\threading.py", line 917, in_bootstrap_inner
    self.run()
  File "C:\Program Files\Python37\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\vs\Desktop\Арсений execute\allsave.py", line 209, in group_parsing
    VALUES (%s,%s,%s,%s)''', a[i])
psycopg2.ProgrammingError: ERROR: syntax error in tsvector: "Reggae.FM:"
LINE 3:         VALUES (181649,'Reggae.FM:'

Когда я добавил эти данные в тип поля «текст», проблем не было.Но, очевидно, «tsvector» не принимает строки, содержащие двоеточие «:» и, возможно, некоторые другие символы.

Вопрос в том, как реализовать полнотекстовый поиск, если «tsvector» не может хранить такие символы.?

PS Использование «text» или «char» не является решением;поиск таких типов данных очень медленный.Я получаю строки, разбирая группы vk.com (русская социальная сеть), то есть имена всех существующих групп.Мне нужно сохранить эти имена в полной форме, чтобы пользователь мог найти их на моем сайте.Но любые решения мне помогут.

1 Ответ

0 голосов
/ 14 февраля 2019

Используйте to_tsvector до , нормализуйте строку и верните tsvector:

INSERT INTO ...
VALUES (%s,to_tsvector(%s),%s,%s)''', a[i])

Обратите внимание, что приведение в качестве tsvector здесь не будет работать:

unutbu=# select 'Reggae.FM:'::tsvector;
ERROR:  syntax error in tsvector: "Reggae.FM:"
LINE 1: select 'Reggae.FM:'::tsvector
               ^

Вот что to_tsvector возвращает:

unutbu=# select to_tsvector('Reggae.FM:');
+---------------+
|  to_tsvector  |
+---------------+
| 'reggae.fm':1 |
+---------------+
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...