我不清楚如何使用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
答案 0 :(得分:3)
我认为你只需要添加:
create index(:clients, [:name], unique: true, using: :gin)
到您的迁移文件。
或者如果索引sql语句会很复杂,你可以用execute
来做,所以它会是这样的:
execute("CREATE INDEX clients_name_index ON clients USING GIN (name)")
我没有测试过,但我相信它应该可行。