我一直在尝试使用Knex.js在我的表中的一列上添加GIN索引,但我无法实现这一点。我正试着做这样的事-
exports.up = function(knex, Promise) {
return knex.schema.createTable('prediction_models', function(table){
table.increments('id');
table.string('model_name').index();
table.jsonb('model_params');
table.timestamp('createdAt').defaultTo(knex.fn.now());
})
.then(createGinIndex());
function createGinIndex() {
return knex.raw('CREATE INDEX modelgin ON public.prediction_models USING GIN (model_params);');
}
};
exports.down = function(knex, Promise) {
return knex.schema.dropTable('prediction_models');
};
我使用PostgreSQL数据库。有没有人能告诉我,这是正确的方法来实现这一点?如果是,我的代码有什么问题,如果不是,如何实现它?谢谢!
4条答案
按热度按时间jdzmm42g1#
那些寻找更“knexy”解决这个问题的人:不需要像Mikael Lepistö的解决方案那样使用
.raw
。.index
可链接接受名为indexType
的第二个参数。它可以这样使用:(the
null
在第一个参数上是我说“为我命名这个索引”)这段代码将生成以下查询:
目前我正在创建这样一个索引,但是出于性能考虑,我希望它只支持
jsonb_path_ops
操作符类(按照section 8.14.4 of the documentation)。这需要create index
语句以using GIN ("column_name" jsonb_path_ops)
结尾。因此,我需要使用raw,但有很多用例.index
就足够了。hs1rzwqc2#
你应该可以创建完整的GIN索引,如下所示:
有关为jsonb列创建索引的更多信息,请参见https://www.vincit.fi/en/blog/objection-js-postgresql-power-json-queries/的末尾
您可以打印出迁移运行的查询,如下所示(http://runkit.com/embed/8fm3z9xzjz9b):
并将它们复制粘贴到psql:
iugsix8n3#
在我的usecase中使用的是生的
iovurdzv4#
GIN索引不能应用于字符串数据类型,但可以应用于数组和JSON数据类型。
如果我们想应用内置的操作符类,如array_ops、jsonb_ops、jsonb_path_ops等。我们可以像下面的例子索引:
假设,表users包含jsonb中的address列,我们想索引address.permanent_address,那么我们可以通过以下方式实现索引: