jsonb键/值上的模式匹配

时间:2015-10-04 23:46:45

标签: json postgresql indexing gin jsonb

我正在使用PostgreSQL 9.4。我的表格有def loginButton(loginButton, didCompleteWithResult: result, error: error) puts result puts error if not error request = FBSDKGraphRequest.alloc.initWithGraphPath("me", parameters:nil, HTTPMethod: "GET") request.startWithCompletionHandler( lambda{ |connection, user, error| #DO_ANYTHING_YOU_WANT_FATE_LOGINING_SUCESSFULLY rmq(@fb_login_button).animate { |btn| btn.move(b: 400) } @name_label = rmq.append(UILabel, :label_name).get @name_label.text = "#{user['first_name']} #{user['last_name']}" rmq(@name_label).animations.fade_in }) end end def loginButtonDidLogOut(loginButton) #DO_ANYTHING_YOU_WANT_HERE end 列:

jsonb

我根据JSONB列中的键/值存储事务。其中一个要求是从键值中搜索客户名称,因此我运行的查询如下:

CREATE TABLE "PreStage".transaction (
  transaction_id serial NOT NULL,
  transaction jsonb
  CONSTRAINT pk_transaction PRIMARY KEY (transaction_id)
);

CREATE INDEX idxgin ON "PreStage".transaction USING gin (transaction);

我做了什么似乎查询并不像GIN索引。如何使查询使用不区分大小写模式搜索的GIN索引?

我尝试将SELECT transaction as data FROM "PreStage".transaction WHERE transaction->>('HCP_FST_NM') ilike ('%neer%'); 列更改为文本,使用jsonb对其进行索引,然后搜索所需文本,然后将结果转换为gin_trgm_ops,然后搜索所需的键/值。这种方法似乎不起作用。

1 个答案:

答案 0 :(得分:8)

默认的GIN索引运算符类jsonb_ops不允许对值进行全文模式匹配。详细说明:

最佳索引策略取决于您的完整情况。有很多选择。要覆盖您提供的一个键,您可以使用功能三元组索引。您已经测试了gin_trgm_ops,因此您已经熟悉了附加模块pg_trgm。对于那些不是:

安装模块后:

CREATE INDEX idxgin ON "PreStage".transaction
USING gin ((transaction->>'HCP_FST_NM') gin_trgm_ops);

然后支持此查询:

SELECT transaction AS data
FROM   "PreStage".transaction
WHERE  transaction->>'HCP_FST_NM' ILIKE '%neer%';

我还删除了一些不必要的括号。

根据未知的详细信息,有多种选项可以优化索引覆盖率。

例如 ,如果许多行根本没有密钥'HCP_FST_NM',请将其设为部分索引排除不相关的行并保持索引较小:

CREATE INDEX idxgin ON "PreStage".transaction
USING gin ((transaction->>'HCP_FST_NM') gin_trgm_ops)
WHERE transaction ? 'HCP_FST_NM';

? being the jsonb containment operator.
并为每个应该使用此索引的查询添加相同的谓词:

SELECT transaction AS data
FROM   "PreStage".transaction
WHERE  transaction->>'HCP_FST_NM' ILIKE '%neer%'
AND    transaction ? 'HCP_FST_NM';  -- even if that seems redundant.