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
不允许对值进行全文模式匹配。详情:
最佳索引策略取决于您的整体情况。有很多选择。要仅覆盖您提供的一个键,您可以使用功能三元索引。您已经测试了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.
【讨论】:
谢谢!如何在为 ex 创建索引时使用多个键: CREATE INDEX idxgin ON "PreStage".transaction USING gin ((transaction->>'HCP_FST_NM'),(transaction->>'HCP_LST_NM') gin_trgm_ops) 不起作用 @user3832677:请开始一个新问题。我按照给定的方式回答了这个问题。评论不是新问题的地方。您始终可以链接到此问题以获取上下文。请务必在新问题中提供所有必要信息。以上是关于jsonb键/值上的模式匹配的主要内容,如果未能解决你的问题,请参考以下文章
将 rdd 映射到空值上的 java 语音匹配库时,Spark 抛出 java.lang.NullPointerException