Как создать пользовательский класс operator, который использует индексацию gin в postgresql?

#sql #postgresql

#sql #postgresql

Вопрос:

Я создал много пользовательских функций и операторов в postgresql, и я хочу создать класс operator для них всех, и я хочу использовать для них индексацию gin. Я не думаю, что я хорошо понял документацию postgres, потому что я не могу заставить ее работать. У кого-нибудь есть идея, как это сделать? В частности, как добавить индексацию gin. Я попытался просто создать класс operator и добавить его с ПОМОЩЬЮ gin, но когда я запускаю его через analize, он говорит, что он не использует поиск по индексу.

С уважением

РЕДАКТИРОВАТЬ: я создал операторы, которые будут выполнять глубокий поиск в формате jsonb по предоставленной вами паре ключ-значение. Они будут обрабатывать все значения как даты, чтобы вы могли выполнять поиск в виде <, >, =, != . Для этих операторов я создал класс operator
CREATE OPERATOR CLASS operatorClassName FOR TYPE jsonb
USING GIN as
OPERATOR 1 operatorSymbol (jsonb,jsonb),
OPERATOR 2 operatorSymbol (jsonb,jsonb),
OPERATOR 3 operatorSymbol (jsonb,jsonb),
OPERATOR 4 operatorSymbol (jsonb,jsonb)
И когда я запустил explain, он говорит, что вместо индекса используется последовательное сканирование. Что я сделал не так?

ПРАВКА2:

 CREATE OPERATOR CLASS custom_jsonb_dates_operators FOR TYPE jsonb
USING gin AS
OPERATOR 1 #>? (jsonb, jsonb),
OPERATOR 2 #<? (jsonb, jsonb),
OPERATOR 3 #=? (jsonb, jsonb),
OPERATOR 4 #!=? (jsonb, jsonb);

CREATE OR REPLACE FUNCTION generic_jsonb_search(
entityObject jsonb,
filterObject jsonb
)
RETURNS boolean
LANGUAGE 'plpgsql'
AS $
DECLARE rec record; 
BEGIN
FOR rec in 
    SELECT key, value
    FROM jsonb_each_text(filterObject) as each(key, value)
LOOP
    IF (
        (WITH RECURSIVE jsonb_key_value_merge(key, value) AS (
        SELECT t.key, t.value
        FROM jsonb_each(entityObject) as t

        UNION ALL

        SELECT t.key, t.value
        FROM jsonb_key_value_merge, jsonb_each(CASE
        WHEN jsonb_typeof(jsonb_key_value_merge.value) <> 'object' THEN '{}' :: JSONB
        ELSE jsonb_key_value_merge.value
        END) as t
        )
        SELECT COUNT(*) 
        FROM jsonb_key_value_merge t
        where jsonb_typeof(t.value) <> 'object' 
         AND t.value::date > (rec.value)::date AND rec.key = t.key) = 0
    )
    THEN
        RETURN FALSE;
    END IF;
END LOOP;
RETURN TRUE;
END
$
 

Комментарии:

1. Вы должны точно описать, что вы сделали и каковы ваши намерения. Мы можем помочь найти и решить проблему, но мы не можем предоставить руководство по расширению индексации PostgreSQL.

2. Вы правы. Я отредактировал сообщение, надеюсь, это немного прояснит ситуацию

3. А вы SET enable_seqscan = off; ?

4. Да, и он по-прежнему использует последовательное сканирование

5. Спасибо. Но я не вижу запроса, включающего один из новых операторов в коде функции, поэтому мне все равно нужно увидеть запрос, в котором он завершается с ошибкой. Кроме того, CREATE INDEX было бы полезно знать. Я не понимаю, почему вы опубликовали это определение функции.