Допустим, нам нужно проверить, содержит ли столбец jsonb определенное значение, соответствующее подстроке в любом из значений (не вложенных, только первый уровень).
Как эффективно оптимизировать запрос для поиска значения по всему JSONB
столбцу (то есть по каждому ключу)?
Есть ли хорошая альтернатива выполнению ILIKE %val%
на типе данных jsonb, преобразованном в текст?
jsonb_each_text(jsonb_column) ILIKE '%val%'
В качестве примера рассмотрим эти данные:
SELECT
'{
"col1": "somevalue",
"col2": 5.5,
"col3": 2016-01-01,
"col4": "othervalue",
"col5": "yet_another_value"
}'::JSONB
Как бы вы оптимизировали такой запрос, когда вам нужно искать шаблон %val%
в записях, содержащих разные конфигурации ключей для разных строк в столбце jsonb?
Я знаю, что поиск с предшествующим и последующим знаком %
неэффективен, поэтому ищу лучший способ, но с трудом его найти. Кроме того, явная индексация всех полей в столбце json не является вариантом, поскольку они различаются для каждого типа записи и создадут огромный набор индексов (не каждая строка имеет одинаковый набор ключей).
Вопрос
Есть ли лучшая альтернатива извлечению каждой пары ключ-значение в текст и выполнению поиска ILIKE / POSIX?
pg_trgm
может быть лучшим вариантом (тип ilike / posix) для этого поскольку вы все еще используете тип критериев сопоставления с образцом в столбце jsonb - person Dmitry Savinkov   schedule 27.04.2016gin_trgm_ops
, вы также можете проверить этот ответ - person Dmitry Savinkov   schedule 27.04.2016somethink LIKE '%<somevalue>%'
, по умолчанию неэффективны, поскольку всегда вызывают полное сканирование данных. Так что предложение @DmitrySavinkov - почти лучшее решение. ИМО, это должен быть ответ с кратким объяснением. - person Abelisto   schedule 27.04.2016%
и т. Д. В основном я прошу способ эффективно искать каждый ключ jsonb по его значению (без его явной распаковки в текст) - person Kamil Gosciminski   schedule 28.04.2016