- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正尝试从几个表中的几个列中提取数据,以使其可进行全文搜索,但我的运气并不好。
这是我的功能:
CREATE OR REPLACE FUNCTION on_customer_save_udpate_tsv() RETURNS trigger AS $$
declare
tsv_text text;
begin
SELECT string_agg(cust_text.text, ' ') as agg_text into tsv_text
FROM (SELECT concat("name", ' ', "phone") as text
FROM "Customers"
where "id" = NEW.id
UNION
SELECT concat("firstName", ' ', "lastName", ' ', "phone", ' ', "email") as text
FROM "Contacts"
where "customerId" = NEW.id
UNION
SELECT concat("streetLine1", ' ', "city", ' ', "state", ' ', "zip") as text
FROM "Addresses"
where "customerId" = NEW.id) cust_text;
NEW.tsv := to_tsvector(coalesce(tsv_text,''));
return NEW;
end
$$ LANGUAGE plpgsql;
这是我的触发器:
CREATE TRIGGER cust_tsv_trigger BEFORE INSERT OR UPDATE
ON "Customers" FOR EACH ROW EXECUTE PROCEDURE on_customer_save_udpate_tsv();
但是,“Customers”.tsv 列在插入/更新后为空。
当我手动运行大部分函数时,它按预期工作。
DO $$
declare
tsv_text text;
begin
SELECT string_agg(cust_text.text, ' ') as agg_text into tsv_text
FROM (SELECT concat("name", ' ', "phone") as text
FROM "Customers"
where "id" = 17
UNION
SELECT concat("firstName", ' ', "lastName", ' ', "phone", ' ', "email") as text
FROM "Contacts"
where "customerId" = 17
UNION
SELECT concat("streetLine1", ' ', "city", ' ', "state", ' ', "zip") as text
FROM "Addresses"
where "customerId" = 17) cust_text;
UPDATE "Customers"
SET tsv = to_tsvector(coalesce(tsv_text, ''))
WHERE "id" = 17;
end
$$ LANGUAGE plpgsql;
我是 postgres 的新手。我错过了什么?
最佳答案
由于触发器在 BEFORE INSERT 或 UPDATE 运行时,让它从表中选择以获取新值是有缺陷的,因为新值还不存在。
考虑这部分查询:
SELECT concat("name", ' ', "phone") as text
FROM "Customers"
where "id" = NEW.id
在 INSERT 的情况下,您将始终在此处获得 NULL,而在 UPDATE 的情况下,您将获得即将被替换的值而不是新值。
应该用作上述代码的直接替代的是:
SELECT (NEW.name || ' ' || NEW.phone) AS text
另一点看起来可疑的是:如果 3 个表中任何一个的用户详细信息中的任何字段为 NULL,那么整个连接的内容将是空的,因为代码应用了 coalesce
在最后而不是在每个单独的字段上都这样做。
关于postgresql - 触发器在插入/更新时不更新 tsvector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859241/
我正在尝试获取给定记录的“可能相关”记录。 表上有一个 tsvector (tsv),所以我在考虑如何将源 tsv 转换为 tsquery 格式,然后像普通排名搜索一样找到最密切相关的匹配项。 SEL
我想在包含所有包含数字的字符串的列上使用 postgres tsquery,如下所示: FRUIT-239476234 如果我尝试从中制作 tsquery: select to_tsquery('FR
所以我的问题是我在表中添加了一个 tsvector 类型的列,但没有将它添加到实体类中,现在当我想运行 doctrine:schema:update --force 时,它给了我这个错误 Unknow
我正在尝试创建一个 PostgreSQL 查询来查找 tsvector 列中的部分文本。 我有一个像这样的 tsvector 值 "'89' 'TT7' 'test123'" 我需要找到包含“%es%
我做了以下事情: ALTER TABLE blog_entry ADD COLUMN body_tsv tsvector; CREATE TRIGGER tsvectorupdate BEFORE I
我一直在寻找一种在 sqlalchemy 中使用 tsvector 的方法(就像 INTEGER 等其他方法一样),但到目前为止我还不清楚如何做到这一点。我读过可以使用 UserDefinedType
我想实现一个使用向量空间模型的信息检索系统,但具有多术语标记和自定义术语加权函数。 我正在考虑在 PostgreSQL 而不是文件系统中构建我的倒排索引。我读到 GIN 索引,它在 tsvector
我只想在 tsvector 中搜索文本中仅有的单词。有没有办法做到这一点?指定一个词必须是最后一个或第一个词怎么样?我使用 tsvector 的原因是我需要匹配词干。 更新:示例数据是一个包含三行的表
我有两个简单的表。首先是品牌,每个品牌可能都有一个顶级品牌。例如,Elseve 有一个顶级品牌,即 Loreal Paris。但雅芳没有顶级品牌。我有一个简单的产品表。 这里是 sqlfiddle 这
我正尝试从几个表中的几个列中提取数据,以使其可进行全文搜索,但我的运气并不好。 这是我的功能: CREATE OR REPLACE FUNCTION on_customer_save_udpate_t
我有以下几行文字: “蓝色药丸”; “红色药丸”; “蓝移”; “红眼”。 我想选择行,其中 Red 是第一个单词,Pill 是第二个单词。假设地,它可以通过使用 tsquery 和 tsvector
我得到了一个包含超过 5000 万条记录的数据库表我需要尽快进行全文搜索。 在一个较小的表上,我只是在文本列上有一个索引,我使用相似性函数来获得相似的结果。我还能够根据 similarity() 的结
EDIT2:我将保留文本的其余部分用于上下文,但我发现问题与我的备份或数据模型无关。我通过以下操作成功地重现了这个问题: createdb -w -T template0 localeTestDb -
我有一个带有文本字段的表和一个包含该字段的搜索索引的 tsvector: CREATE TABLE test (pk bigint, value text, tsv tsvector); 如何创建一个
我(重新)对 tsvector 字段感到困惑。将文本连接到一个 tsvector 字段,然后进行索引的示例非常很常见。如果您查找 PG 12 生成的列,您会发现示例显示 tsvector 字段填充 q
我正在考虑向现有表中添加一个 tsvector 列,该列将包含同一表中多个列的可能搜索词(例如,tsvector 列将等于 to_tsvector(header || ' ' || body || '
我在表中有一个 tsvector 列,我希望能够从 tsvector 中删除一个词素。 我已经开始尝试使用 ts_stat 来重建一个新的 tsvector,但它看起来相当复杂。 有什么简单的方法吗?
我有以下 tsvector 更新触发器,用于表上的 tsvector 列“user_tsv”,允许我执行全文搜索, CREATE TRIGGER tsvector_user_update BEFORE
这是错误还是功能?我在 tsvector 属性上创建了一个索引(不使用字典)。 查询 SELECT title FROM table WHERE title_tsv @@ to_tsquery('ba
有什么方法可以从 tsvector 中获取有关词位在句子中的位置和出现次数的信息吗? 像这样 SELECT * FROM get_position(to_tsvector('english', 'Th
我是一名优秀的程序员,十分优秀!