Как добавить связанный столбец таблицы в sql to_tsvector?

Я работаю над API django, в котором мне нужно реализовать функцию поиска по мере ввода. Сначала я хотел использовать Django SearchVector и SearchQuery, но они, кажется, плохо работают, когда термины запроса неполные (что не идеально для части, когда вы печатаете), поэтому я выбрал подход SQL. Мне нужно иметь возможность искать по first_name и last_name контакта, а также по электронной почте пользователя, связанного с этим контактом.

Я использовал следующее, чтобы создать search_vector для контакта и добавить индекс в этот столбец. Это прекрасно работает для поиска по имени и фамилии.

ALTER TABLE contact_contact 
ADD COLUMN search_vector tsvector;
    
UPDATE contact_contact
SET search_vector = to_tsvector('english', coalesce(first_name, '') || ' ' || coalesce(last_name, ''));

CREATE INDEX mc_idx2 ON contact_contact USING GIN (search_vector);

Я хотел бы добавить адрес электронной почты пользователя к этому search_vector, что-то вроде:

...
SET search_vector = to_tsvector('english', coalesce(first_name, '') || ' ' || coalesce(last_name, '') || coalesce(user.email::text, ' '));
...

Я получаю следующую ошибку

ОШИБКА: синтаксическая ошибка в или около . СТРОКА 2: ...|| ' ' || объединиться (фамилия, '') || объединить(user.email::te..

"." относится к `user.email. Я не могу понять правильный синтаксис или процесс для этого. Любая помощь приветствуется!


person Antoine Quellier    schedule 15.02.2021    source источник
comment
какое именно сообщение об ошибке   -  person eshirvana    schedule 15.02.2021
comment
ОШИБКА: синтаксическая ошибка в или около . СТРОКА 2: ...|| ' ' || объединиться (фамилия, '') || объединение(user.email::te.. . относится к user.email   -  person Antoine Quellier    schedule 15.02.2021
comment
что такое пользователь, это имя таблицы? вы обновляете contact_contact   -  person eshirvana    schedule 15.02.2021
comment
user — имя связанной таблицы. Я хотел бы обновить столбец search_vector таблицы contact_contact, чтобы поиск можно было выполнять в столбцах first_name и last_name, а также в email. first_name и last_name — это столбцы из таблицы contact_contact, а email — это столбцы из таблицы user.   -  person Antoine Quellier    schedule 15.02.2021
comment
см. мой обновленный ответ   -  person eshirvana    schedule 15.02.2021


Ответы (1)


то вам нужно присоединиться к двум таблицам:

UPDATE contact_contact cc
SET search_vector = to_tsvector('english', coalesce(first_name, '') || ' ' || coalesce(last_name, '') || ' ' || coalesce(u.email::text, '') || ' ' || coalesce(co.name::text, '')) 
FROM user u 
JOIN company co
 On co.contact_id = cc.id 
WHERE u.contact_id = cc.id
person eshirvana    schedule 15.02.2021
comment
Спасибо, в моем вопросе действительно была опечатка! Но это не причина, по которой эта команда sql не работает - person Antoine Quellier; 15.02.2021
comment
@ширвана да! это сделано! - person Antoine Quellier; 15.02.2021
comment
Большое спасибо, это именно то, что мне было нужно! Допустим, я хочу позже выполнить поиск в другой компании, связанной с таблицами. Получил бы я что-то вроде этого? SET search_vector = to_tsvector('english', coalesce(first_name, '') || ' ' || coalesce(last_name, '') || ' ' || coalesce(u.email::text, '') || ' ' || coalesce(co.name::text, '')) FROM user u, company co WHERE u.contact_id = cc.id and co.contact_id = cc.id - person Antoine Quellier; 15.02.2021
comment
отлично, спасибо еще раз :) - person Antoine Quellier; 15.02.2021