Postgres 9.4+中JSONB嵌入式Ecto2模型的索引

时间:2016-08-21 20:18:37

标签: postgresql elixir phoenix-framework ecto jsonb

我不清楚如何使用Ecto2 / Postgres 9.4 +

索引存储为JSONB的嵌入式结构

我有一个使用embeds_one和embeds_many的两个嵌入式结构的模式。它们是ecto:Postgres中表示的地图字段为JSONB。我想知道如何确保它们被编入索引(使用Gin?)以进行快速查询?我不确定这是否会自动发生,如果我需要为迁移添加索引,或者我需要使用psql等手动执行此操作。

只是想澄清它是如何工作的。 谢谢!

defmodule App.Repo.Migrations.CreateClient
  def change do
    create table(:clients) do
      add :name, :string
      add :settings, :map
      add :roles, {:array, :map}, default: []
      timestamps()
    end

    // This works for normal schema/model fields
    create index(:clients, [:name], unique: true, using: :gin)

    // BUT CAN I INDEX MY EMBEDS HERE?
    // GUESS: 
    create index(:clients, [:settings], using: :gin)
  end
end

defmodule App.Client do
  schema "client" do
    field :name, :string
    embeds_one  :settings, Settings // single fixed schema "Settings" model
    embeds_many :roles, Role        // array of "Role" models 
  end
end

defmodule Settings do
  use Ecto.Model
  embedded_schema do           // ALSO 
    field :name, :string       // are types relevant?          
    field :x_count, :integer   // stored as strings (INDEXED?)
    field :is_active, :boolean // deserialized via cast?
  end
end

defmodule Role do
  use Ecto.Model
  embedded_schema do      
    field :token   
    field :display_english  
    field :display_spanish
  end
end

1 个答案:

答案 0 :(得分:3)

我认为你只需要添加:

create index(:clients, [:name], unique: true, using: :gin)

到您的迁移文件。

或者如果索引sql语句会很复杂,你可以用execute来做,所以它会是这样的:

execute("CREATE INDEX clients_name_index ON clients USING GIN (name)")

我没有测试过,但我相信它应该可行。