2016-10-13 2 views
3

Я хочу использовать PostgreSQL 9.5.4 на AWS RDS, используя полнотекстовый поиск, словари со стоп-словами, безударный полнотекстовый поиск.На AWS RDS Postgres, как есть словари и безударный полнотекстовый поиск?

Контекст:

С 'unaccent' на, это полный текст (JSON) запрос будет найти 'F (E-острый) vrier', даже если не был введен акцент правильно

psql>select * from proto_model.product where to_tsvector((body ->> 'description')) @@ to_tsquery('Fevrier'); 

С помощью английского словаря поиск того же «для», «любого», «вы» ... не найдет ничего, поскольку они будут «останавливать слова», определенные в английском словаре, и игнорируются.

Вопрос:

На моей местной Postgres, это не проблема вообще. На управляемом AWS это одно. EC2 + Docker на AWS не будет проблемой, конечно, но сейчас я сосредотачиваюсь на RDS Postgres.

Локально значением по умолчанию default_text_search_config (получить его с psql>show all) является «pg_catalog.english», который использует английский словарь и останавливает слова. В RDS это «pg_catalog.simple».

1) В AWS я не могу добавить словарь или изменить его, поскольку вам нужен доступ к файловой системе, которого у вас нет. Программного решения для создания/обновления словаря AFAIK нет.

2) В АМС, так как пользователей, к которым «Postgres» или даже как «rds_superuser», который вы можете create, я не могу изменить глобальную конфигурацию

psql>ALTER SYSTEM SET default_text_search_config = 'pg_catalog.english'; 
ERROR: must be superuser to execute ALTER SYSTEM command 

Кроме того, отсутствует РДС Postgres группы параметров, которые вы можете связать с новым экземпляром Postgres, и вы не можете добавить отсутствующие значения! Предоставление большего количества «rds_superuser» (psql>grant all on schema public to ...) не помогает.

3) В AWS, как 'Postgres' или 'rds_superuser', я могу однако установить для моей сессии, текущая конфигурация текста

psql>set default_text_search_config = 'pg_catalog.english'; 
SET 

4) К сожалению, в АМС, как 'Postgres' или «rds_superuser ', Я не могу изменить конфигурацию поиска (глобальную), чтобы игнорировать акценты. Это прекрасно работает на местном уровне.

psql>ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR hword, hword_part, word WITH unaccent, english_stem; 
ERROR: must be owner of text search configuration english 

5) В AWS, как «Postgres» или «rds_superuser», я могу создать новую конфигурацию поиска (английский + Unaccent), но я не могу установить его по умолчанию, даже в моей сессии!

psql>CREATE TEXT SEARCH CONFIGURATION english2 (copy=english); 
CREATE... 
psql>ALTER TEXT SEARCH CONFIGURATION english2 ALTER MAPPING FOR hword, hword_part, word WITH unaccent, english_stem; 
ALTER... 
psql>set default_text_search_config = 'pg_catalog.english2'; 
ERROR: invalid value for parameter "default_text_search_config": "pg_catalog.english2" 

Так что кажется, что я готовлю.

Самое лучшее, что я могу видеть, может быть автоматически ассоциируют ж/оа необходимо для индивидуального psql>set default_text_search_config = ... моего подключения пользователя к набору опций конфигурации

psql>alter role somerole set default_text_search_config = 'pg_catalog.english'; 
psql>select * from pg_user; (the option is present by default for all my connections under this role) 

Вне перемещения из AWS RDS на EC2 + Докер , знаете ли вы какое-либо решение для (4) или (5) предоставления мне словаря + unaccent?

Благодаря

Оливье

ответ

2

Не полагайтесь на default_text_search_config.

Вместо этого создайте собственную конфигурацию текстового поиска, как и в # 5. Затем используйте два-аргумент форму to_tsvector указать, что конфигурация пользовательского поиска текста вместо значения по умолчанию:

SELECT * from mytable where to_tsvector('myconfig', description) 
    @@ to_tsquery('cat & dog') 

Дополнительное преимущество версии два-аргумента to_tsvector является то, что она позволяет использовать «индекс экспрессии "к власти поиска текста, а не отдельный столбец в вашей поисковым вектором таблице:

CREATE_INDEX mytable_tsv_idx ON mytable USING GIN 
    (to_tsvector('myconfig', description)); 
-- This query will use the index 
SELECT * from mytable WHERE to_tsvector('myconfig', description) 
    @@ to_tsquery('cat & dog'); 
-- This query, despite setting the default config, 
-- will not use the expression index. 
SET default_text_search_config = 'myconfig'; 
SELECT * from mytable WHERE to_tsvector(description) 
    @@ to_tsquery('cat & dog'); 

https://www.postgresql.org/docs/9.5/static/textsearch-tables.html#TEXTSEARCH-TABLES-INDEX

1

Вы можете изменить путем изменения параметров ролей в базе данных, как:

ALTER ROLE [role] IN DATABASE [database] 
    SET default_text_search_config TO 'pg_catalog.english'; 

 Смежные вопросы

  • Нет связанных вопросов^_^