Я использую pg_search
в приложении rails вместо представления. В этом представлении есть два столбца tsvector
, которые индексируются по двум столбцам, по которым я хочу искать, last_name
и first_name
. У меня tsearch настроен на prefix
и соответствует any_word
.
Допустим, у меня есть столбцы, заполненные как «Smith» и «John». Если я буду искать «Смит», я получу ожидаемые результаты. Однако, если я ищу «Джон», я не получаю вообще никаких результатов.
Вот моя область поиска, определенная в модели:
pg_search_scope :search_by_name,
against: [:last_name, :first_name],
using: {
tsearch: {
prefix: true,
any_word: true,
tsvector_column: ["last_name_tsv", "first_name_tsv"]
}
}
А вот мои столбцы tsvector, определенные на вид:
to_tsvector('english', coalesce(token_authenticate_me_users.first_name,'')) as first_name_tsv,
to_tsvector('english', coalesce(token_authenticate_me_users.last_name,'')) as last_name_tsv,
А вот образец сгенерированного запроса для поиска только по полному имени first_name, который не возвращает результатов.
SELECT "candidate_searches"."member_id"
FROM "candidate_searches"
INNER JOIN
(SELECT "candidate_searches"."member_id" AS pg_search_id,
(ts_rank(
("candidate_searches"."last_name_tsv" || "candidate_searches"."first_name_tsv"),
(to_tsquery('simple', ''' ' || 'John' || ' ''' || ':*')), 0))
AS rank
FROM "candidate_searches" WHERE
(("candidate_searches"."last_name_tsv" || "candidate_searches"."first_name_tsv") @@ (to_tsquery('simple', ''' ' || 'John' || ' ''' || ':*')))
)
AS search ON "candidate_searches"."member_id" = search.pg_search_id
ORDER BY search.rank DESC, "candidate_searches"."member_id" ASC