【发布时间】:2016-01-06 16:07:27
【问题描述】:
这是对以下内容的跟进:
Pattern matching on jsonb key/value
我有一张如下表
CREATE TABLE "PreStage".transaction (
transaction_id serial NOT NULL,
transaction jsonb
CONSTRAINT pk_transaction PRIMARY KEY (transaction_id)
);
我的交易 jsonb 列中的内容看起来像
{"ADDR": "abcd", "CITY": "abcd", "PROV": "",
"ADDR2": "",
"ADDR3": "","CNSNT": "Research-NA", "CNTRY": "NL", "EMAIL": "@.com",
"PHONE": "12345", "HCO_NM": "HELLO", "UNQ_ID": "",
"PSTL_CD": "1234", "HCP_SR_NM": "", "HCP_FST_NM": "",
"HCP_MID_NM": ""}
我需要像这样的搜索查询:
SELECT transaction AS data FROM "PreStage".transaction
WHERE transaction->>'HCP_FST_NM' ILIKE '%neer%';
但我需要让我的用户灵活地即时搜索任何键/值。
上一个问题的答案建议将索引创建为:
CREATE INDEX idxgin ON "PreStage".transaction
USING gin ((transaction->>'HCP_FST_NM') gin_trgm_ops);
这可行,但我也想索引其他键。因此尝试了类似的东西:
CREATE INDEX idxgin ON "PreStage".transaction USING gin
((transaction->>'HCP_FST_NM'),(transaction->>'HCP_LST_NM') gin_trgm_ops)
这不起作用。这里最好的索引方法是什么,或者我必须为每个键创建一个单独的索引,在这种情况下,如果将新的键/值对添加到数据中,该方法将不是通用的。
【问题讨论】:
-
在尝试使用两个键创建索引时,如上所示,我收到如下错误:数据类型文本没有访问方法 gin 的默认运算符类。您必须为索引指定一个运算符类或为数据类型定义一个默认运算符类
-
您需要为索引的两个部分指定 gin_trgm_ops,而不仅仅是最后一个。
-
虽然这里是关于 SO 的话题,但它更适合 dba.SE。
标签: postgresql indexing pattern-matching jsonb