2016-08-21 2 views
1

Я не ясно, о том, как индекс внедренный хранится в виде Структуры JSONB с Ecto2/Postgres 9.4+Индексация JSONB встраиваемых моделей Ecto2 в Postgres 9.4+

У меня есть схемы с двумя встроенными структурами с использованием 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 

ответ

2

Я думаю, вам просто нужно добавить следующее:

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

в файл миграции.

Или, если оператор индекса SQL собирается быть сложным, вы можете сделать это с execute так было бы что-то вроде этого:

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

Я не проверял, но я считаю, что это должно работать.

+0

, который определенно подходит для полей верхнего уровня в модели клиента, но я прошу проиндексировать поля JSONB: map – errata

+0

Ну, идите [здесь] (https://www.postgresql.org/docs/current/static /datatype-json.html) и посмотрите раздел 'jsonb Indexing', синтаксис в основном одинаковый для столбцов jsonb, как и для обычных, поэтому мой первый пример должен работать, если вы не добавите определенные параметры для индекса, для которого вы 'd использовать 'execute' – JustMichael

Смежные вопросы