当前位置: 首页 > 面试题库 >

jsonb键/值上的模式匹配

张建华
2023-03-14
问题内容

我正在使用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,然后搜索所需的键/值。这种方法似乎行不通。


问题答案:

默认的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';

?
成为jsonb遏制者。

并向应该使用该索引的每个查询添加相同的谓词:

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


 类似资料:
  • 问题内容: 我正在制作一个键值解析器,其中输入字符串采用的形式。键可以包含字符,并且和值可以包含任何字符,但,,和需要用反斜杠前缀。逗号用于分隔键值对,但在最后一对之后不需要。 到目前为止,我已经可以匹配大多数键和值,但是很显然它将不能处理多于一对的字符或者任何“控制”字符都不能转义。似乎匹配所有转义字符,但不匹配任何“正常”字符。 有没有办法检查逗号分隔并匹配所有转义的“控制”字符以及普通字符?

  • 问题内容: 如何找到具有匹配模式的所有键的计数。 例如,有两个键和。常见的模式是。因此,这里的计数是2。 如何在Redis中做到这一点? 问题答案: 免责声明 我希望这个旧答案不会损坏任何具有数百万把钥匙的生产系统。如果出于某种原因仍要在生产中仍然计算redis的匹配键,最好使用具有匹配模式的scan。 如果仅使用KEYS进行搜索,并使用Redis客户端,您将获得所有匹配密钥的数字列表,对吗? 例

  • 我有以下输入: 我的XSL: 目标是对于每个具有query结果/记录的“query1”,我从该query结果/记录/列[@name='id_contact']中获取值,并从“query2”中删除每个在query2/query结果/记录/列[@name='id_contact']中具有该值的记录。这部分可以工作,但下一部分不能正常工作:然后,在删除query2中的值后,获取剩余的query2/id_

  • 模式匹配,多出现在函数式编程语言之中,为其复杂的类型系统提供一个简单轻松的解构能力。比如从enum等数据结构中取出数据等等,但是在书写上,相对比较复杂。我们来看一个例子: enum Direction { East, West, North, South, } fn main() { let dire = Direction::South; matc

  • 我正在使用jpa的criteriabuilder,希望在jsonb列中查找json字段的值。jsonb如下所示: 我开始创建我的谓词,但我得到了错误。 我得到的错误是 psqlException:错误:函数json_extract(jsonb,字符变化)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 有人能帮忙吗?

  • 本文向大家介绍Scala序列上的模式匹配,包括了Scala序列上的模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 检查集合中元素的准确数量 现场演示 提取first(s) element(s)并将其余部分保留为集合: 通常,可以用于构建序列的任何形式都可以用于与现有序列进行模式匹配。 请注意,在使用Nil和::在对序列进行模式匹配时将起作用,但确实会将其转换为List,并且可能会产生意外结