postgresql - 如何在 Postgresql 查询中删除 pg_catalog 约束?
问题描述
我对 Postgresql 很陌生,使用 PG 9.6,这是一个示例查询:
select * from (select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' inner join "users" on feeds.user_id=users.uid and not users.is_private where to_tsvector('pg_catalog.russian', posts.body) @@ to_tsquery('pg_catalog.russian', 'xxx') union select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' inner join "users" on feeds.user_id=users.uid and not users.is_private where
posts.uid in (
select post_id from comments where to_tsvector('pg_catalog.russian', comments.body) @@ to_tsquery('pg_catalog.russian', 'xxx')
) union select "posts".* from "posts" where "posts"."user_id" = '48d85d83-b562-439f-addf-d75cd75d092f' and to_tsvector('pg_catalog.russian', posts.body) @@ to_tsquery('pg_catalog.russian', 'xxx') union select "posts".* from "posts" where "posts"."user_id" = '48d85d83-b562-439f-addf-d75cd75d092f' and
posts.uid in (
select post_id from comments where to_tsvector('pg_catalog.russian', comments.body) @@ to_tsquery('pg_catalog.russian', 'xxx')
) union select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' inner join "users" on feeds.user_id=users.uid and users.is_private=true where to_tsvector('pg_catalog.russian', posts.body) @@ to_tsquery('pg_catalog.russian', 'xxx') and "feeds"."id" in (5,10,11,12,15,16,17) union select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' inner join "users" on feeds.user_id=users.uid and users.is_private=true where
posts.uid in (
select post_id from comments where to_tsvector('pg_catalog.russian', comments.body) @@ to_tsquery('pg_catalog.russian', 'xxx')
)
and "feeds"."id" in (5,10,11,12,15,16,17) ) as found_posts order by found_posts.bumped_at desc offset 0 limit 31
正如你所看到的,有几个pg_catalog.russian
我不明白他们在查询中的作用。目前,查询不返回“no-ascii”结果的结果。
查询使用 knex 配置文件进行压缩,该文件具有:
textSearchConfigName: 'pg_catalog.russian'
在里面。
我想要的是更改查询(或数据库?),以便它可以查询所有 utf8 字符串。
解决方案
https://www.postgresql.org/docs/9.6/static/textsearch-controls.html
to_tsvector([ config regconfig, ] document text) 返回 tsvector to_tsvector 将文本文档解析为标记,将标记简化为词位,并返回一个 tsvector,其中列出了词位及其在文档中的位置。根据指定或默认的文本搜索配置处理文档。
并进一步:
解析器、字典的选择以及要索引的标记类型由所选的文本搜索配置决定(第 12.7 节)。在同一个数据库中可以有许多不同的配置,并且预定义的配置可用于各种语言。
换句话说,如果您删除'pg_catalog.russian'
默认配置,将被选中。它不会成为“任何语言”的一种。
为了使用 FTS,您需要在使用前了解该语言。通常这意味着当保存文本以将其与 FTS 一起使用时,您将语言保存在下一列中,因此您可以做类似的事情select to_tsvector(language_column, body)
而不是固定russian
值...
此外,您可能想检查 default_text_search_config
which
选择文本搜索函数的变体使用的文本搜索配置,这些变体没有指定配置的显式参数。有关详细信息,请参阅第 12 章。内置默认值为 pg_catalog.simple,但如果可以识别与该区域设置匹配的配置,initdb 将使用与所选 lc_ctype 区域设置对应的设置来初始化配置文件。
不确定是否textSearchConfigName
会以任何方式影响它
推荐阅读
- python - 如何只执行一次 docker 健康检查?
- openapi - NelmioApiDocBundle v4.0.0-BETA1,未找到 $ref
- swift - 在 SwiftUI 框架中使用警报
- firebase - 如何在flutter中切换流生成器中的firestore查询?
- go - 为什么 AWS Beanstalk CLI 部署不会启动 Web 应用程序或在第二次部署而不是第一次部署时导致代理服务器错误?
- mysql - 值或值在范围之间的 SQL
- amazon-web-services - “消息”:“端点请求超时”}:AWS Lambda .net 核心:{
- asp.net-core-mvc - 如何在 Foreach 循环下更改数量或更新购物车结帐
- database - 在 Azure Sql Db 中将特定数据从一个数据库复制到另一个数据库
- python - 在 Python 中的字符串上查找日期和时区