首页 > 解决方案 > 如何在 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 字符串。

标签: postgresqlfull-text-searchknex.js

解决方案


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_configwhich

选择文本搜索函数的变体使用的文本搜索配置,这些变体没有指定配置的显式参数。有关详细信息,请参阅第 12 章。内置默认值为 pg_catalog.simple,但如果可以识别与该区域设置匹配的配置,initdb 将使用与所选 lc_ctype 区域设置对应的设置来初始化配置文件。

不确定是否textSearchConfigName会以任何方式影响它


推荐阅读