postgresql jsonbカラムに部分インデックスを追加しようとしています。 jsonb列の名前は、email_providerです。私は以下のように列に部分的なインデックスを追加しようとしましたが、このように異なるエラーが発生しますPG :: UndefinedColumn:ERROR:列 "email_povider"が存在しませんと、それ以外の時にエラーを発生させます:PG :: AmbiguousFunction :ERROR:オペレータがユニークではありません: - :postgresql jsonbフィールドの部分インデックスを作成します。
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は次のようになります。
不明レール-5移行は次のようになりますで>不明部分インデックス
{
"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
更新以下受け入れ答えに微調整、私はBTREEないジンインデックスを作成するために使用していたコードに基づいて
in rails activerecordを以下に示します。私は「
add_index :accounts, :email_provider, name: "index_accounts_on_email_provider_kind", using: :gin, where: "(email_provider -> 'email_provider' -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com') AND (email_provider -> 'email_povider' -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com')"
:
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"
ありがとう、私はこれを試して、あなたに戻ってきます。ただし、** name列**にインデックスを配置する可能性が最も高いのは、jsonb列が**電子メールプロバイダ**であっても**インデックスが** name列**にあり、** 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' = ' ** btree部分インデックスを作成する**(email_provider - > 'email_povider' - > 'amazon ses' - >> 'smtp_host' = 'www.awses.com') "** ** name列**で、一致をjsonb列の属性に限定します。 – brg