PostgreSQL (Pesquisa de texto completo) vs ElasticSearch


10

Olá, estou fazendo alguma pesquisa antes de implementar o recurso de pesquisa em meu serviço. Atualmente, estou usando o PostgreSQL como meu armazenamento principal. Definitivamente, eu poderia usar a pesquisa de texto completo do PostgreSQL, mas o problema é que tenho dados espalhados por várias tabelas.

Meu serviço é um site de comércio eletrônico. Portanto, se um cliente pesquisar "um bom laptop da apple", preciso entrar em uma Brandtabela, posttabela e reviewtabela (uma postagem é uma combinação de várias revisões + breve resumo) para pesquisar completamente todas as postagens. Se eu usasse a elasticsearch, poderia inserir postagens completas por pré-processamento.

De minha pesquisa, algumas pessoas disseram que o STF e a elasticsearch do PostgreSQL têm desempenho semelhante e algumas pessoas disseram que a pesquisa elástica é mais rápida. Qual seria a melhor solução para o meu caso?

desde já, obrigado


Como você sabe que a palavra-chave de pesquisa está relacionada a algumas tabelas que você armazenou em seu banco de dados?
Conifers

Eu não .. Então, eu estava pensando em juntar todas as colunas possíveis em tabelas diferentes e transformá-las em ts_vector. Existem soluções melhores?
JSC

Hmm, isto implicará no reconhecimento semântico problema e é uma outra história ...
Conifers

Respostas:


-5

Resposta curta: Elasticsearch é melhor

Explicação: O PostgreSQL e o Elasticsearch são bancos de dados diferentes de dois tipos. O Elasticsearch é poderoso para pesquisar documentos e o PostgreSQL ainda é um RDBMS tradicional. Verifique seu objetivo de pesquisar textos em algumas postagens. Independentemente do desempenho do PostgreSQL em suas pesquisas de texto completo, o Elasticsearch foi projetado para pesquisar em enormes textos e documentos (ou registros). E quanto mais tamanho você desejar pesquisar, mais Elasticsearch será melhor que o PostgreSQL em desempenho. Além disso, você também pode obter muitos benefícios e ótimo desempenho se pré-processar as postagens em vários campos e índices bem antes de armazenar no Elasticsearch.

Se você certamente precisa de um recurso de texto completo, considere o MSSQL, que pode se sair melhor que o PostgreSQL.

Resposta nos comentários: deve ser o senso comum para a comparação de propriedades nos diferentes tipos de banco de dados. Como o OP não forneceu qual quantidade e tamanho de dados armazenados. Se este for um tamanho pequeno de dados em pesquisa, talvez escolha Postgre ou ES estejam OK. No entanto, se o repositório de transações e dados se tornar tão maior no futuro, o ES obterá seu benefício.

Você pode verificar este site para conhecer a classificação atual de cada tipo de banco de dados e escolher a melhor dentre seus requisitos, arquitetura e crescimento de dados no futuro de seus aplicativos.


Concordou com a retórica, mas se você tiver alguma prova ou outras fontes, será mais confiável.
Jaisus

2
Sua resposta é baseada apenas em suas opiniões, você não escreveu nenhum exemplo, benchmark ou link para provar seu argumento e não consigo ver outras respostas suas sobre o assunto que podem provar que você conhece esses softwares. Vejo que você é um novo colaborador, portanto, sugiro que, da próxima vez, não escreva sentenças absolutas e relate suas experiências, dados reais ou links para provar sua tese.
Paolo Melchiorre

@conifers boa atualização e esclarecimentos sobre sua resposta, mas o link que você adicionou não prova seu ponto. Eu estava interessado se você teria adicionado um URL com uma comparação ou uma referência.
Paolo Melchiorre

classificar por popularidade não significa que o Elasticsearch supere o PostgreSQL quando se trata de pesquisa de texto completo. "Melhor" e "Deve ser o senso comum" significa que esperamos ver algum benchmark ou teste que compare essas duas tecnologias em sua resposta que não existem.
Yasser Sinjab

9

Se o PostgreSQL já estiver na sua pilha, a melhor opção é usar a pesquisa de texto completo do PostgreSQL.

Por que a pesquisa de texto completo (STF) no PostgreSQL?

Porque, caso contrário, você precisará alimentar o conteúdo do banco de dados para mecanismos de pesquisa externos.

Os mecanismos de pesquisa externos (por exemplo, elasticsearch) são rápidos, MAS :

  • Eles não podem indexar todos os documentos - podem ser totalmente virtuais
  • Eles não têm acesso a atributos - sem consultas complexas
  • Eles precisam ser mantidos - dor de cabeça para o DBA
  • Às vezes eles precisam ser certificados
  • Eles não fornecem pesquisa instantânea (precisam de tempo para baixar novos dados e reindexar)
  • Eles não fornecem consistência - os resultados da pesquisa já podem ser excluídos do banco de dados

Se você quiser ler mais sobre o STF no PostgreSQL, há uma ótima apresentação de Oleg Bartunov (extraí a lista acima daqui): " Você precisa de uma pesquisa de texto completo no PostgreSQL? "

Este é um pequeno exemplo de como você pode criar um "Documento" (leia a documentação de pesquisa de texto ) de mais de uma tabela no SQL:

SELECT to_tsvector(posts.summary || ' ' || brands.name) 
FROM posts
INNER JOIN brands ON (brand_id = brands.id);

Se você estiver usando o Django no seu site de comércio eletrônico, também poderá ler este artigo que escrevi em " Pesquisa de texto completo no Django com PostgreSQL "


Algo na declaração da elasticsearch está errado ... Eles não podem indexar todos os documentos: Certamente você pode! Se você já o identificou e transformou em sua configuração durante a indexação, assim como no PostgreSQL, você precisa definir o DDL primeiro. Eles não têm acesso a atributos : Sim, pode ser verdade devido ao PostgreSQL ser usado em bancos de dados de uso geral, precisa suportar bem o CRUD. Eles precisam ser mantidos : O PostgreSQL não precisa ser mantido? ... O backup de rotina, o ajuste de desempenho ainda são necessários, independentemente do tipo de banco de dados.
Conifers

Eles não oferecem pesquisa instantânea : Bem, o ES é forte na pesquisa instantânea ... tente o Kibana primeiro. Eles não fornecem consistência : Essa pode ser a única declaração verdadeira, pois qualquer RDBMS é necessário nas propriedades do ACID.
Conifers

1
A frase completa é: Eles não fornecem pesquisa instantânea (precisa de tempo para baixar novos dados e reindexar) : significa que se o usuário no site de comércio eletrônico (como na pergunta) comprar o último Item1 disponível, essas informações serão armazenadas instantaneamente no PostgreSQL, e se você usar a pesquisa de texto completo do PostgreSQL, outros usuários não encontrarão o Item1 na seção de pesquisa. Caso contrário, se você usar o Elasitcsearch, precisará de tempo para enviar essas novas informações ao Elasticsearch e reindexar antes que outros usuários parem de ver o Item1 no resultado da pesquisa. Talvez eles tentem comprá-lo, mas ele não está mais disponível. :-(
Paolo Melchiorre

2
Sobre todos os outros pontos da lista, só quero escrever uma coisa: na pergunta original, a @jsc escreveu que já possui o PostgreSQL em sua pilha, para que os dados já estejam armazenados lá, eles já têm acesso a todos os atributos para executar o texto completo pesquise com consulta relacional. MAS, se você usar o Elasticsearch, precisará adicionar tempo para enviar uma pequena parte dos dados (nem todos os atributos) do PG para o ES, tempo para reindexar os dados no ES. No final, usando o ES, você terá outro serviço para gerenciar, mais memória ocupada e mais espaço de armazenamento para armazenar dados redundantes e atrasar todo o processo.
Paolo Melchiorre
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.