【问题标题】:add index on jsonb field在 jsonb 字段上添加索引
【发布时间】:2016-03-06 15:21:35
【问题描述】:

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

field: {'array_key' : [1, 2, 3, 4]}

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

搜索查询类似于

select * where field['array_key'].include?(2)

【问题讨论】:

  • 您可以添加搜索查询的外观吗?
  • 确定.. 类似,选择 * where field['array_key'].includes?(2)

标签: ruby-on-rails postgresql indexing jsonb


【解决方案1】:

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

add_index(
  :pictures,
  "(metadata->>'Year')",
  name: "index_pictures_on_metadata_year"
)

应该输出类似

CREATE  INDEX  "index_pictures_on_metadata_year" ON "pictures"  ((metadata->>'Year'))

【讨论】:

  • 这个解决方案为 rails 5 创建了索引 btree 和 ((metadata->>'Year'::text)) 在查询 postgres 使用 Sec Scan 而不是 Index Scan
【解决方案2】:

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

add_index :table_name, :field, :using => :gin, :expression => "(field->'array_key')", :name => 'index_table_name_on_field_array_keys'

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

where("table_name.field->'array_keys' @> ?", Array(2))

【讨论】:

  • 这需要什么版本的rails?我正在运行 4.2.1 并获得:An error has occurred, this and all later migrations canceled: Unknown key: :expression
  • 啊,我知道这是 rails 5 的新功能。guides.rubyonrails.org/…
  • add_index :table_name, "(field->'array_key')", using: :gin, name: 'index_table_name_on_field_array_keys' 在 Rails 5.0.0 中
  • 你如何在 Rails 4 中做到这一点?即可爱的是我们在 Rails 5 中拥有它,但是有没有办法在 Rails 4 中破解这个索引创建,因为它实际上除了迁移之外并没有做任何事情,并且索引是在 postgres 端处理的?
  • 对于 rails 4.2,我发现这篇文章很有帮助:nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2018-06-25
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多