首页 > 解决方案 > 将带有冒号“:”的字符串添加到“tsvector”数据类型时出错

问题描述

在我的 PostgreSQL 11 数据库中,有一个带有“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(俄罗斯社交网络)得到这些行,即所有现有组的名称。我需要保留这些名称的完整形式,以便用户可以在我的网站上找到它们。但任何解决方案都会帮助我。

标签: sqldatabasepostgresql

解决方案


用于规范化字符串并返回to_tsvectora :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)

推荐阅读