如何索引 JSONB 字段中数组内的对象?

How to index objects inside array in JSONB field?

我想 index JSONB 字段 GIN 索引。在这个字段中,我有一个 arrayobjects。准确地说,它看起来是这样的(用三个点缩短了第二个 object):

[
    {
        "tags": ["student work", "fast apply"],
        "intensity": [
            {
                "shift": "fulltime",
                "period": "hours",
                "duration": "9"
            },
            {
                "shift": "parttime",
                "period": "hours",
                "duration": "4"
            }
        ]
    },
    { ... }
]

这就是我在 WHERE 子句中过滤此 table 的方式:

items.intensity @? '$[*] ? (@.tags == "student work" || @.tags == "undefined" || @.tags.size() == 0) ? (@.intensity[*].shift == "fulltime")'

这是我试过但没有用的索引:

CREATE INDEX idxginintensitytags ON items USING GIN (intensity jsonb_path_ops);

解释分析:

    #   Node    Rows    Loops
Actual
1.  Bitmap Heap Scan on items as items (rows=154922 loops=1)
Recheck Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
Heap Blocks: exact=33478
154922  1
2.  Bitmap Index Scan using idxginintensitytags (rows=154922 loops=1)
Index Cond: (intensity @? '$[*]?(@."intensity"[*]."shift" == "fulltime")'::jsonpath)
154922  1

我想按 tagsshiftsperiodsdurations 过滤我的 tabletable.

我有 200,000 rows

我怎样才能index这个field

我使用的是最新版本 - PostgreSQL 13

在我手中,一个问题是它确实使用了索引,尽管这样做速度较慢。原因是 @.tags.size() == 0 不能由索引确定,所以它最终返回所有 table 行进行重新检查,但计划者显然没有意识到会发生这种情况。

你能用不同的方式表达这个概念吗?