我想向postgresql jsonb列添加部分索引。 jsonb列被命名为:email_provider。我曾尝试在列上添加一个部分索引,但它会抛出不同的错误,如下所示PG :: UndefinedColumn:错误:列“email_povider”不存在并在其他时间引发错误:PG :: AmbiguousFunction :错误:操作者不是唯一的:未知 - >未知为postgresql jsonb字段创建部分索引
局部索引在导轨-5迁移看起来像这样:
add_index :accounts, :name, name: "index_accounts_on_email_provider_kind", using: :gin, where: "('email_provider' -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com') AND ('email_povider' -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com')"
用于email_provider列中的JSON看起来像这样:
{
"email_provider": {
"sparkpost": {
"smtp_host": "www.sparkpost.com",
"smtp_port": ""
},
"aws ses": {
"smtp_host": "www.amazon/ses.com ",
"smtp_port": " ",
"username": " ",
"password": " "
}
}
}
表看起来是这样的:
class CreateAccounts < ActiveRecord::Migration[5.0]
def change
create_table :accounts do |t|
t.string :name, null: false
t.jsonb :email_provider, null: false
t.jsonb :social_account, default: '[]', null: false
t.timestamps
end
add_index :accounts, :name, name: "index_accounts_on_email_provider_kind", using: :gin, where: "('email_provider' -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com') AND ('email_povider' -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com')"
add_index :accounts, :name, name: "index_accounts_on_social_account_type", using: :gin, where: " 'social_account' @> [{'type': 'facebook'}] AND 'social_account' @> [{'type': 'twitter'}]"
end
end
更新
基础上稍作调整下面的接受的答案,代码我使用创造B树没有杜松子酒指数在rails中activerecord如下所示。
add_index :accounts, :name, name: "index_accounts_on_name_email_provider", where: "email_provider -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com' AND email_provider -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com' "
add_index :accounts, :name, name: "index_accounts_on_name_social_account", where: " social_account @> '[{\"type\": \"facebook\"}]'::jsonb AND social_account @> '[{\"type\": \"twitter\"}]'::jsonb"
谢谢,我会尝试一下并回复你。但是,尽管jsonb列是**电子邮件提供商**,我很可能会将索引放置在**名称列**,因为当索引位于**名称列**和**其中query **用于限制我们的索引与jsonb列中的匹配。你可以看到这里解释的方法:http://blog.heapanalytics.com/speeding-up-postgresql-queries-with-partial-indexes/。 – brg
非常感谢。我将索引保存在**名称列**中。唯一的变化是删除**使用::gin **,因为索引不是直接在jsonb列上。因此,其中一个索引的最终代码如下所示:** add_index:accounts,:name,name:“index_accounts_on_name_email_provider”,其中:“(email_provider - >'email_provider' - >'sparkpost' - >>'smtp_host'=' ')和(email_provider - >'email_povider' - >'amazon ses' - >>'smtp_host'='www.awses.com')“**,这会创建一个** btree部分索引**在**名称列** **限制我们的匹配到jsonb列中的属性。 – brg