Полнотекстовый поиск не дает результатов

У меня есть следующий вид:

CREATE VIEW public.profiles_search AS
    SELECT
        profiles.id,
        profiles.bio,
        profiles.title,
        (
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.title::text), 'B'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.bio), 'A'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.category::text), 'B'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, array_to_string(profiles.tags, ',', '*')), 'C'::"char")
        ) AS document
    FROM profiles
    GROUP BY profiles.id;

Однако если profiles.tags пуст, то document пусто, даже если остальные поля (заголовок, биография и категория) содержат данные.

Есть ли способ сделать поле необязательным, чтобы оно содержало пустые данные и не приводило к пустому документу?

1 ответ

Решение

Кажется, это общая проблема конкатенации строк - конкатенация NULL значение делает весь результат NULL,

Здесь предлагается всегда указывать значение по умолчанию для любого ввода с coalesce():

UPDATE tt SET ti =
    setweight(to_tsvector(coalesce(title,'')), 'A')    ||
    setweight(to_tsvector(coalesce(keyword,'')), 'B')  ||
    setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
    setweight(to_tsvector(coalesce(body,'')), 'D');

Если вы не хотите предоставлять значения по умолчанию для сложных типов данных (например, coalesce(profiles.tags, ARRAY[]::text[]) как предполагает @approxiblue), я подозреваю, что вы могли бы просто сделать:

CREATE VIEW public.profiles_search AS
    SELECT
        profiles.id,
        profiles.bio,
        profiles.title,
        (
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.title::text), 'B'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.bio), 'A'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, profiles.category::text), 'B'::"char") ||
            setweight(to_tsvector(profiles.search_language::regconfig, coalesce(array_to_string(profiles.tags, ',', '*'), '')), 'C'::"char")
        ) AS document
    FROM profiles
    GROUP BY profiles.id;
Другие вопросы по тегам