Полнотекстовый поиск не дает результатов
У меня есть следующий вид:
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;