Tenho uma lista de pessoas que varia entre 2-5k
entradas que tem esse formato geral:
firstname1 lastname1, firstname2 lastname2, firstname3 lastname3 ...
Eu tenho um user_table
que contém cerca 250-300k
de entradas com a firstname
e lastname
coluna. O que estou tentando fazer é permitir que os usuários insiram essa lista de nomes em um campo e retornem todos os usuários no banco de dados com nomes correspondentes. Meu primeiro instinto foi criar uma view chamada name_search
assim ->
create view name_search as (
select
id,
to_tsvector(concat(firstname, ' ', lastname)) as search_field
from user_table
)
Então eu posso pesquisá-lo transformando todos os nomes na lista separada por vírgulas em uma string como esta
const queryString = "(firstname1 <-> lastname1) | (firstname2 <-> lastname2) | (firstname3 <-> lastname3) ..."
então eu posso passar essa string para esta consulta
select
*
from name_search
where search_field @@ to_tsquery(queryString)
Estou deixando de fora alguns detalhes como escapar da string etc etc, mas meu problema é que isso é terrivelmente lento. Eu queria saber se alguém poderia me ajudar a criar uma solução para isso que é mais rápida.
Não vejo um caso para pesquisa de texto completo aqui.
Você pode fornecer sua string de entrada como está para esta consulta:
Um índice em
(firstname, lastname)
deve ajudar no desempenho enquanto a lista de entrada não é muito longa. Para recuperar mais de alguns por cento de todas as linhas, uma varredura sequencial é mais rápida de qualquer maneira.Relacionado: