Em termos de capacidade e desempenho de pesquisa , quais são os prós e os contras de implementar tags como um campo de texto completo ou ou ?array
text
Estou vendo limitações de capacidade na escolha de implementar tags com uma matriz, porque me parece que se uma matriz contém ['juicy fruit']
, alguém que está procurando 'fruit'
não encontrará esse registro (por exemplo, tags && ARRAY['fruit']
não o encontrará). A pessoa que criou esse registro teria que inserir algo mais parecido ['juicy fruit', 'juicy', 'fruit']
para que seu registro fosse encontrado com apenas uma pesquisa por 'fruit'
ou 'juicy'
. Considerando que, se eu implementar tags como text
, uma pesquisa por 'fruit'
localizará 'juicy fruit'
, e ainda mais, se eu implementar tags como texto completo , localizarei 'juicy fruit'
ao pesquisar com a string 'fruits'
(plural). Além disso, acho que não haverá perda de desempenho na pesquisa de texto completo. Pensamentos?
Mas talvez o objetivo das tags seja a correspondência exata .
Você pode obter a funcionalidade de pesquisa com arrays usando as
ANY/SOME
funções or generate_subscripts. No entanto, a documentação do PostgreSQL observa o seguinte:Portanto, parece que você está no caminho certo, porque está correto sobre não perder desempenho (provavelmente você o ganharia) e os outros métodos permitem maior flexibilidade. As próprias tags tratam de correspondências exatas, mas a maioria dos sites também tem uma maneira de pesquisar tags (por exemplo, este mesmo site ).
Se você implementar o armazenamento de tags como texto completo , isso não impedirá a correspondência, incluindo regex, com expressões mais simples, como
LIKE/ILIKE
. Um cenário comum é armazenar documentos (os pedaços de texto que estão sendo pesquisados) comotext
ouvarying character
e armazenar otsvector
tipo necessário para pesquisa de texto completo em uma coluna separada. Consulte a documentação do PostgreSQL para saber mais sobre como criar um índice de texto completo.Os prós e contras devem então ser evidentes: usar um
array
limita a escalabilidade e as opções de pesquisa porque não possui indexação de texto, radicalização e suporte de inflexão, mas é fácil de usar quando uma correspondência exata é desejada. O uso de um tipo detext
dados é mais flexível ao pesquisar strings. O uso de um tipo de dados com uma colunatext
gerada fornece maior flexibilidade e bom desempenho em todos os cenários, mas requer mais armazenamento.tsvector