Как удалить ограничение pg_catalog в запросе Postgresql? - PullRequest
0 голосов
/ 06 мая 2018

Я новичок в 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 голосов
/ 06 мая 2018

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

to_tsvector ([config regconfig,] текст документа) возвращает tsvector to_tsvector анализирует текстовый документ в токены, уменьшает токены в лексемы, и возвращает tsvector, который перечисляет лексемы вместе с их позициями в документе. Документ обработан в соответствии с заданной конфигурацией поиска по умолчанию

и далее:

Выбор парсера, словарей и типов токенов для индексации определяются выбранной конфигурацией текстового поиска (раздел 12,7). Можно иметь много разных конфигураций в одной и той же базе данных, и предопределенные конфигурации доступны для различных языки.

другими словами, если вы удалите 'pg_catalog.russian', будет выбрана конфигурация по умолчанию. И его нельзя назвать "любым языком".

Чтобы использовать FTS, вам необходимо знать язык перед его использованием. Обычно это означает, что при сохранении текста для использования его с FTS вы сохраняете язык в следующем столбце, так что вы можете сделать что-то вроде select to_tsvector(language_column, body) вместо фиксированного russian значения ...

Также вы можете захотеть проверить default_text_search_config, который

Выбирает конфигурацию текстового поиска, которая используется этими вариантами функций текстового поиска, которые не имеют явного аргумента указав конфигурацию. См. Главу 12 для получения дополнительной информации. По умолчанию встроено pg_catalog.simple, но initdb будет инициализирован файл конфигурации с настройкой, соответствующей выбранному lc_ctype locale, если конфигурация, соответствующая этой локали, может быть определены.

Не уверен, влияет ли textSearchConfigName на это каким-либо образом или нет

...