Sql tsvectors的串联会导致Postgres 9.4.6中的语法错误
在SQL查询中从setweight连接tsvectors时,会引发语法错误: 如果我尝试使用由Sql tsvectors的串联会导致Postgres 9.4.6中的语法错误,sql,postgresql,postgresql-9.4,lateral-join,Sql,Postgresql,Postgresql 9.4,Lateral Join,在SQL查询中从setweight连接tsvectors时,会引发语法错误: 如果我尝试使用由setweight返回的单个tsvector,并且如果我尝试在另一个to_tsvector调用中包装整个内容,它会出现错误,原因是没有to_tsvector(tsvector)函数,因此串联确实形成了一个tsvector SELECT *, ts_rank_cd(textsearch, query) AS score FROM products, plainto_tsquery('awesome shi
setweight
返回的单个tsvector,并且如果我尝试在另一个to_tsvector
调用中包装整个内容,它会出现错误,原因是没有to_tsvector(tsvector)
函数,因此串联确实形成了一个tsvector
SELECT *, ts_rank_cd(textsearch, query) AS score
FROM products, plainto_tsquery('awesome shirt') query,
setweight(to_tsvector(coalesce(title, '')), 'A') ||
setweight(to_tsvector(coalesce(description, '')), 'B') ||
setweight(to_tsvector(coalesce(tags, '')), 'C') ||
setweight(to_tsvector(coalesce(vendor, '')), 'D') textsearch
WHERE shop_url='somedomain.com' AND query @@ textsearch
ORDER BY score DESC
LIMIT 20 OFFSET 0;
我曾尝试将其包装在子查询中,但这会使其成为记录,这会导致
ts\u rank\u cd
出现问题,因为它希望textsearch
为tsvector类型。我怎样才能让这个concatedtsvector在这个查询中工作 假设列标题
,说明
等应返回到表产品
您看到的语法错误与文本搜索本身无关。这应该起作用:
SELECT *, ts_rank_cd(textsearch, query) AS score
FROM products
CROSS JOIN LATERAL plainto_tsquery('awesome shirt') query
CROSS JOIN LATERAL (
SELECT setweight(to_tsvector(coalesce(title , '')), 'A')
|| setweight(to_tsvector(coalesce(description, '')), 'B')
|| setweight(to_tsvector(coalesce(tags , '')), 'C')
|| setweight(to_tsvector(coalesce(vendor , '')), 'D')
) ts (textsearch)
WHERE ...
为什么?
因为:
SELECT ...
FROM products, plainto_tsquery('awesome shirt') query ...
是FROM
子句中的隐式交叉连接侧向。对于函数,可以省略横向
关键字。逗号大部分(见末尾的链接)相当于一个交叉连接
这也适用于:
SELECT ...
FROM products
, plainto_tsquery('awesome shirt') query
, setweight(to_tsvector(coalesce(title, '')), 'A') -- just another function
...
因此:
如果我尝试使用setweight返回的单个tsvector,效果会很好
但是对于其他表达式不允许使用相同的简短语法,如setweight(…)| setweight(…)
。这些需要包装在一个SELECT
语句中,该语句需要一个显式的LATERAL
关键字,以允许引用FROM
列表中的“LATERAL”表。就像上面演示的那样。或简称:
SELECT *, ts_rank_cd(textsearch, query) AS score
FROM products
, plainto_tsquery('awesome shirt') query
, LATERAL (
SELECT setweight(to_tsvector(coalesce(title , '')), 'A')
|| setweight(to_tsvector(coalesce(description, '')), 'B')
|| setweight(to_tsvector(coalesce(tags , '')), 'C')
|| setweight(to_tsvector(coalesce(vendor , '')), 'D')
) ts (textsearch)
WHERE ...
关于交叉连接
和横向连接
的更多解释的相关答案:
谢谢!这似乎现在起作用了。这就解释了为什么单函数调用不会导致语法错误。
SELECT *, ts_rank_cd(textsearch, query) AS score
FROM products
, plainto_tsquery('awesome shirt') query
, LATERAL (
SELECT setweight(to_tsvector(coalesce(title , '')), 'A')
|| setweight(to_tsvector(coalesce(description, '')), 'B')
|| setweight(to_tsvector(coalesce(tags , '')), 'C')
|| setweight(to_tsvector(coalesce(vendor , '')), 'D')
) ts (textsearch)
WHERE ...