如何在Postgresql查询中删除pg_catalog约束?

时间:2018-05-06 16:12:04

标签: postgresql full-text-search knex.js

我对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字符串。

1 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/9.6/static/textsearch-controls.html

  

to_tsvector([config regconfig,] document text)返回tsvector   to_tsvector将文本文档解析为标记,减少标记   到lexemes,并返回一个将lexemes列在一起的tsvector   他们在文件中的位置。文档已处理完毕   根据指定或默认的文本搜索配置。

并进一步:

  

解析器,字典以及要索引的标记类型的选择   由所选的文本搜索配置决定(部分   12.7)。可以在同一数据库中具有许多不同的配置,并且可以为各种配置提供预定义的配置   语言。

换句话说,如果删除'pg_catalog.russian',将选择默认配置。并且它不会成为"任何语言"之一。

要使用FTS,您需要在使用之前了解该语言。通常,这意味着在保存文本以将其与FTS一起使用时,您可以在下一栏中保存语言,因此您可以使用select to_tsvector(language_column, body)而不是固定的russian值...

您也可以want to check the default_text_search_config

  

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

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