在jsonb字段上添加索引

Raz*_*aza 12 postgresql indexing ruby-on-rails jsonb

我需要在Postgres中搜索jsonb字段的数组键的值.

field: {'array_key' : [1, 2, 3, 4]}
Run Code Online (Sandbox Code Playgroud)

是否可以添加索引array_key或是否有任何优化方法来搜索值?

搜索查询会是这样的

select * where field['array_key'].include?(2)
Run Code Online (Sandbox Code Playgroud)

Raz*_*aza 13

您可以在jsonb键上创建索引,

add_index :table_name, :field, :using => :gin, :expression => "(field->'array_key')", :name => 'index_table_name_on_field_array_keys'
Run Code Online (Sandbox Code Playgroud)

然后,您可以搜索索引键,因为,

where("table_name.field->'array_keys' @> ?", Array(2))
Run Code Online (Sandbox Code Playgroud)

  • `add_index:table_name,"(field - >'array_key')",在Rails 5.0.0中使用:: gin,name:'index_table_name_on_field_array_keys'` (7认同)
  • 这需要什么版本的 Rails?我正在运行 4.2.1 并得到:“发生错误,此迁移和所有后续迁移均已取消:未知密钥::表达式” (2认同)
  • 你怎么在rails 4中做到这一点?也许我们在Rails 5中拥有它,但有没有办法在Rails 4中破解这个索引创建,因为除了迁移之外它实际上没有做任何其他事情而且在postgres端处理索引? (2认同)
  • 对于 Rails 4.2,我发现这篇文章很有帮助:https://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails (2认同)

sch*_*pet 7

假设您有一个带有“元数据”jsonb 列的“图片”表

add_index(
  :pictures,
  "(metadata->>'Year')",
  name: "index_pictures_on_metadata_year"
)
Run Code Online (Sandbox Code Playgroud)

应该输出类似的东西

CREATE  INDEX  "index_pictures_on_metadata_year" ON "pictures"  ((metadata->>'Year'))
Run Code Online (Sandbox Code Playgroud)