jsonb键/值上的模式匹配

Posted

技术标签:

【中文标题】jsonb键/值上的模式匹配【英文标题】:Pattern matching on jsonb key/value 【发布时间】:2015-10-04 23:46:45 【问题描述】:

我使用的是 PostgreSQL 9.4。我的表有一个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);

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

SELECT transaction as data FROM "PreStage".transaction
WHERE  transaction->>('HCP_FST_NM') ilike ('%neer%');

我所做的似乎查询不喜欢 GIN 索引。如何使查询使用不区分大小写的模式搜索的 GIN 索引?

我尝试将jsonb 列更改为文本,使用gin_trgm_ops 对其进行索引,然后搜索所需的文本,然后将结果转换为json,然后搜索所需的键/值。这种方法似乎行不通。

【问题讨论】:

缺少一个体面问题的所有基础知识:Postgres 版本、表定义、基数、示例数据、预期结果、您尝试过的... 欧文请发现它已更新 好多了。请描述jsonb 列中的内容并添加一个或多个示例值。 这里的后续问题:***.com/q/33025890/939860 【参考方案1】:

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

What's the proper index for querying structures in arrays in Postgres jsonb?

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

PostgreSQL LIKE query performance variations

模块安装后:

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.

【讨论】:

谢谢!如何在为 ex 创建索引时使用多个键: CREATE INDEX idxgin ON "PreStage".transaction USING gin ((transaction->>'HCP_FST_NM'),(transaction->>'HCP_LST_NM') gin_trgm_ops) 不起作用 @user3832677:请开始一个新问题。我按照给定的方式回答了这个问题。评论不是新问题的地方。您始终可以链接到此问题以获取上下文。请务必在新问题中提供所有必要信息。

以上是关于jsonb键/值上的模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用模式匹配更新(MS Access)

将 rdd 映射到空值上的 java 语音匹配库时,Spark 抛出 java.lang.NullPointerException

Jq:递归删除与给定模式匹配的所有键

具有精确键列表的模式匹配映射

Redis 查找匹配字符串的模式键

获取与模式匹配的所有 JSON 键