Индексирование элементов массива PostgreSQL JSONB - PullRequest
0 голосов
/ 10 апреля 2019

Как видно из названия, как я могу индексировать массив JSONB?

Содержимое выглядит как ...

["some_value", "another_value"]

Я могу легко получить доступ к таким элементам, как ...

SELECT * FROM table WHERE data->>0 = 'some_value';

Я создал индекс так ...

CREATE INDEX table_data_idx ON table USING gin ((data) jsonb_path_ops);

Когда я запускаю EXPLAIN, я все еще вижу, как он последовательно сканирует ...

Чего не хватает при индексации массива текстовых элементов?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

В итоге я выбрал другой подход.У меня все еще возникают проблемы с поиском, чтобы работать с использованием типа JSONB, поэтому я переключил свой столбец на varchar ARRAY

CREATE TABLE table (
    data varchar ARRAY NOT NULL
);

CREATE INDEX table_data_idx ON table USING GIN (data);

SELECT * FROM table WHERE data @> '{some_value}';

. Это работает и использует индекс.


Я думаю, что моя проблема с моим подходом JSONB заключается в том, что элемент на самом деле вложен гораздо дальше и рассматривается как текст.

т.е. data->'some_key'->>'array_key'->>0

И каждый раз, когда я пытаюсь найти, я получаювсевозможные ошибки недопустимого токена и другие подобные вещи.

0 голосов
/ 10 апреля 2019

Если вы хотите поддержать этот точный запрос с индексом, индекс должен выглядеть следующим образом:

CREATE INDEX ON "table" ((data->>0));

Если вы хотите использовать имеющийся у вас индекс, вы не можете ограничить поиск только конкретным элементом массива (в вашем случае, первым). Вы можете ускорить поиск для some_value в любом месте в массиве:

SELECT * FROM "table"
WHERE data @> '["some_value"]'::jsonb;
...