我想在AWS RDS上使用PostgreSQL 9.5.4,利用全文搜索,带停用词的词典,无重音的全文搜索。
上下文:
打开'unaccent'时,即使我没有正确输入重音,这个全文(Json)查询也会找到'F(e-acute)vrier'
psql>select * from proto_model.product where to_tsvector((body ->> 'description')) @@ to_tsquery('Fevrier');
使用英语词典,同样搜索“the”,“any”,“you”...将找不到任何内容,因为它们是英语词典中定义的“停用词”并被忽略。
问题:
在我当地的Postgres上,这根本不是问题。在托管AWS上,这是一个。 AWS上的EC2 + Docker当然不是问题,但我现在专注于RDS Postgres。
在本地,默认值default_text_search_config(使用psql>show all
获取)是'pg_catalog.english',它使用英语词典和停用词。在RDS上,这是'pg_catalog.simple'。
1)在AWS中,我无法添加字典或修改字典,因为您需要您没有的文件系统访问权限。创建/更新字典AFAIK没有编程解决方案。
2)在AWS中,作为'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实例关联的RDS 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)遗憾的是,在AWS中,作为'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 + Docker之外,您是否知道(4)或(5)为我提供字典+无关的任何解决方案?
答案 0 :(得分:1)
不要依赖default_text_search_config。
而是像在#5中一样创建自己的文本搜索配置。然后使用to_tsvector
的双参数形式指定自定义文本搜索配置而不是默认值:
SELECT * from mytable where to_tsvector('myconfig', description)
@@ to_tsquery('cat & dog')
to_tsvector
的双参数版本的另一个好处是,它允许您使用“表达式索引”来启动文本搜索,而不是表中的单独的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 :(得分:1)
您可以通过更改数据库中的角色参数进行更改,如:
ALTER ROLE [role] IN DATABASE [database]
SET default_text_search_config TO 'pg_catalog.english';