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.