【发布时间】:2016-08-22 02:59:33
【问题描述】:
假设我们需要检查 jsonb 列是否包含与任何值中的子字符串匹配的特定值(非嵌套,仅第一级)。
如何有效地优化查询以在整个 JSONB 列(这意味着每个键)中搜索值?
在转换为文本的 jsonb 数据类型上执行 ILIKE %val% 有什么好的选择吗?
jsonb_each_text(jsonb_column) ILIKE '%val%'
以这些数据为例:
SELECT
'{
"col1": "somevalue",
"col2": 5.5,
"col3": 2016-01-01,
"col4": "othervalue",
"col5": "yet_another_value"
}'::JSONB
当需要在包含 jsonb 列中不同行的不同键配置的记录中搜索模式 %val% 时,您将如何优化这样的查询?
我知道使用前面和后面的 % 符号进行搜索效率低下,因此寻找更好的方法但很难找到。此外,显式索引 json 列中的所有字段不是一种选择,因为它们因每种类型的记录而异,并且会创建大量索引(并非每一行都有相同的键集)。
问题
除了将每个键值对提取到文本并执行 ILIKE/POSIX 搜索之外,还有更好的替代方法吗?
【问题讨论】:
-
这可能更适合 dba.stackexchange.com,我只是想为这件事吸引更多的观众。
-
pg_trgm可能是最好的选择(ilike/posix 类型),因为您仍在 jsonb 列中使用模式匹配标准类型 -
@DmitrySavinkov 你能详细说明一下吗?我相信我仍然需要将 json 数据解压缩到单独的行中。
-
是的,你需要解压值,所以
gin_trgm_ops操作符类可以应用,你也可以检查检查这个answer -
somethink LIKE '%<somevalue>%'之类的过滤器在默认情况下效率低下,因为它总是会导致对数据进行全面扫描。所以@DmitrySavinkov 的建议几乎是最好的解决方案。 IMO 它应该是答案,并附有简短的解释。
标签: postgresql lookup jsonb postgresql-9.5