Как индексировать плоский текстовый массив PostgreSQL JSONB для нечеткого и привязанного к правой части поиска? - PullRequest
1 голос
/ 03 апреля 2019

Версия PostgreSQL: 9,6.

Таблица events имеет столбец visitors JSONB:

CREATE TABLE events (name VARCHAR(256), visitors JSONB);

Столбец visitors содержит "плоский" массив JSON:

["John Doe","Frédéric Martin","Daniel Smith",...].

Таблица events содержит 10 миллионов строк, в каждой строке от 1 до 20 посетителей.

Можно ли индексировать значения массива для эффективного поиска по шаблону:

  1. оставлено на якоре : выбрать события, посетители которых соответствуют 'John%'
  2. привязка справа : выберите события, посетители которых соответствуют '% Doe'
  3. без акцента : выберите события, посетители которых соответствуют 'Frederic%'
  4. без учета регистра : выберите события, посетители которых соответствуют 'john%'

Мне известно о существовании расширения триграмм Postgres gin_trgm_ops, позволяющего создавать индексы для нечувствительного к регистру и привязанного к правой части поиска, но я не могу понять, как создавать индексы триграмм для содержимого "flat" Массивы JSON.

Я прочитал Сопоставление с образцом по ключу / значению jsonb и Индекс для поиска элемента в массиве JSON , но представленные решения, похоже, не применимы к моему варианту использования.

1 Ответ

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

Вы должны привести jsonb к text и создать на нем индекс триграммы:

CREATE EXTENSION pg_trgm;
CREATE INDEX ON events USING gin
   ((visitors::text) gin_trgm_ops);

Затем используйте поиск по регулярному выражению в столбце. Например, для поиска John Doe вы можете использовать:

SELECT ...
FROM events
WHERE visitors::text *~ '\mJohn Doe\M';

Индекс триграмм поддержит этот запрос.

...