Estou construindo um site Django e estou procurando um mecanismo de pesquisa.
Alguns candidatos:
Lucene / Lucene com Bússola / Solr
Esfinge
Pesquisa de texto completo do Postgresql
Pesquisa de texto completo do MySQl
Critério de seleção:
- relevância e classificação do resultado
- velocidade de pesquisa e indexação
- facilidade de uso e facilidade de integração com o Django
- requisitos de recursos - o site será hospedado em um VPS , portanto, idealmente, o mecanismo de pesquisa não exigiria muita memória RAM e CPU
- escalabilidade
- recursos extras, como "você quis dizer?", pesquisas relacionadas etc.
Qualquer pessoa que tenha experiência com os mecanismos de pesquisa acima ou com outros mecanismos que não estão na lista - eu adoraria ouvir suas opiniões.
EDIT: Quanto às necessidades de indexação, à medida que os usuários continuam inserindo dados no site, esses dados precisam ser indexados continuamente. Ele não precisa ser em tempo real, mas o ideal é que novos dados sejam exibidos no índice com um atraso de mais de 15 a 30 minutos
mysql
postgresql
full-text-search
lucene
sphinx
Continuação
fonte
fonte
Tsearch
não suporta a pesquisa de frases. No entanto, está na lista TODO sai.msu.su/~megera/wiki/FTS_Todo .Respostas:
É bom ver que alguém falou sobre Lucene - porque não faço ideia disso.
Esfinge, por outro lado, eu sei muito bem, então vamos ver se posso ajudar.
Não tenho ideia de como isso é aplicável à sua situação, mas Evan Weaver comparou algumas das opções comuns de pesquisa do Rails (Sphinx, Ferret (um porto de Lucene para Ruby) e Solr), executando alguns benchmarks. Poderia ser útil, eu acho.
Não mergulhei nas profundezas da pesquisa de texto completo do MySQL, mas sei que ele não compete em termos de velocidade nem de recursos com Sphinx, Lucene ou Solr.
fonte
Não conheço o Sphinx, mas, quanto ao Lucene versus uma pesquisa de texto completo no banco de dados, acho que o desempenho do Lucene é incomparável. Você deve conseguir fazer quase qualquer pesquisa em menos de 10 ms, não importa quantos registros você precise pesquisar, desde que você tenha configurado seu índice Lucene corretamente.
Aí vem o maior obstáculo: pessoalmente, acho que integrar o Lucene no seu projeto não é fácil . Claro, não é muito difícil configurá-lo para que você possa fazer uma pesquisa básica, mas se quiser tirar o máximo proveito disso, com desempenho ideal, então definitivamente precisará de um bom livro sobre Lucene.
Quanto aos requisitos de CPU e RAM, realizar uma pesquisa no Lucene não sobrecarrega muito sua CPU, embora a indexação de seus dados ocorra, embora você não faça isso com muita frequência (talvez uma ou duas vezes por dia), de modo que isso não é possível. um grande obstáculo.
Ele não responde a todas as suas perguntas, mas, resumindo, se você tem muitos dados para pesquisar e deseja um ótimo desempenho, acho que o Lucene é definitivamente o caminho a percorrer. Se você não tiver tantos dados para pesquisar, é melhor fazer uma pesquisa de texto completo no banco de dados. Configurar uma pesquisa de texto completo no MySQL é definitivamente mais fácil no meu livro.
fonte
Estou surpreso que não haja mais informações publicadas sobre o Solr. O Solr é bastante semelhante ao Sphinx, mas possui recursos mais avançados (o AFAIK, como eu não usei o Sphinx - apenas li sobre ele).
A resposta no link abaixo detalha algumas coisas sobre o Sphinx, que também se aplicam ao Solr. Comparação de mecanismo de pesquisa de texto completo - Lucene, Sphinx, Postgresql, MySQL?
O Solr também fornece os seguintes recursos adicionais:
BTW, existem muitos outros recursos; no entanto, listei apenas os recursos que realmente usei na produção. BTW, fora da caixa, o MySQL suporta # 1, # 3 e # 11 (limitado) na lista acima. Para os recursos que você procura, um banco de dados relacional não é suficiente. Eu os eliminaria imediatamente.
Além disso, outro benefício é que o Solr (na verdade, o Lucene) é um banco de dados de documentos (por exemplo, NoSQL), e muitos dos benefícios de qualquer outro banco de dados de documentos podem ser obtidos com o Solr. Em outras palavras, você pode usá-lo para mais do que apenas pesquisar (ou seja, Desempenho). Seja criativo com isso :)
fonte
Apache Solr
Além de responder às perguntas do OP, deixe-me apresentar algumas idéias sobre o Apache Solr, da introdução simples à instalação e implementação detalhadas .
Solr não deve ser usado para resolver problemas em tempo real. Para os mecanismos de busca, o Solr é praticamente um jogo e funciona perfeitamente .
O Solr funciona bem em aplicativos da Web de alto tráfego ( li em algum lugar que não é adequado para isso, mas estou fazendo o backup dessa declaração ). Ele utiliza a RAM, não a CPU.
O impulso ajuda a classificar seus resultados no topo. Digamos que você esteja tentando procurar um nome john nos campos firstname e lastname , e queira dar relevância ao campo firstname , depois precisará aumentar o campo firstname como mostrado.
Como você pode ver, o campo de nome é aumentado com uma pontuação de 2.
Mais sobre SolrRelevancy
A velocidade é incrivelmente rápida e sem comprometer isso. A razão pela qual me mudei para Solr .
Em relação à velocidade de indexação, o Solr também pode manipular JOINS a partir de suas tabelas de banco de dados. Um JOIN mais alto e complexo afeta a velocidade da indexação. No entanto, uma enorme configuração de RAM pode facilmente lidar com essa situação.
Quanto maior a RAM, maior a velocidade de indexação do Solr.
Nunca tentei integrar o Solr e o Django , no entanto, você pode fazer isso com o Haystack . Encontrei algum artigo interessante sobre o mesmo e aqui está o github .
O Solr gera na RAM; portanto, se a RAM é alta, você não precisa se preocupar com o Solr. .
O uso de RAM do Solr dispara na indexação completa, se você tiver alguns bilhões de registros, poderá usar as importações da Delta de maneira inteligente para lidar com essa situação. Como explicado, o Solr é apenas uma solução quase em tempo real .
O Solr é altamente escalável. Dê uma olhada no SolrCloud . Algumas características principais.
Para o cenário acima, você pode usar o SpellCheckComponent que acompanha o Solr . Existem muitos outros recursos, o SnowballPorterFilterFactory ajuda a recuperar registros, digamos que, se você digitou livros , em vez de livro , você verá os resultados relacionados ao livro .
Esta resposta se concentra amplamente no Apache Solr e MySQL . O Django está fora do escopo.
Supondo que você esteja no ambiente LINUX, continue com este artigo. (o meu era uma versão do Ubuntu 14.04)
Começando
Baixar Apache Solr a partir daqui . Essa seria a versão é 4.8.1 . Você pode baixar novas versões, eu achei isso estável.
Depois de baixar o arquivo, extraia-o para uma pasta de sua escolha. Diga ..
Downloads
ou o que seja .. Então vai parecerDownloads/solr-4.8.1/
No seu prompt. Navegue dentro do diretório
shankar@shankar-lenovo: cd Downloads/solr-4.8.1
Então agora você está aqui ..
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$
Inicie o servidor de aplicativos Jetty
O Jetty está disponível dentro da pasta de exemplos do
solr-4.8.1
diretório, então navegue dentro dele e inicie o Jetty Application Server.shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar
Agora, não feche o terminal, minimize-o e deixe-o de lado.
Para verificar se o Apache Solr é executado com êxito, visite este URL no navegador.http: // localhost: 8983 / solr
Executando o Jetty na porta personalizada
É executado na porta 8983 como padrão. Você pode alterar a porta aqui ou diretamente dentro do
jetty.xml
arquivo.java -Djetty.port=9091 -jar start.jar
Faça o download do JConnector
Esse arquivo JAR atua como uma ponte entre MySQL e JDBC, faça o download da versão independente da plataforma aqui
Após o download, extraia a pasta, copie
mysql-connector-java-5.1.31-bin.jar
e cole no diretório lib .shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib
Criando a tabela MySQL para ser vinculada ao Apache Solr
Para usar o Solr , é necessário ter algumas tabelas e dados para pesquisar. Para isso, usaremos o MySQL para criar uma tabela e enviar alguns nomes aleatórios e, em seguida, poderíamos usar o Solr para conectar-se ao MySQL. e indexar essa tabela e suas entradas.
1. estrutura da tabela
2. preencha a tabela acima
Entrando no núcleo e adicionando as diretivas da lib
1. Navegue para
2.Modificando o solrconfig.xml
Adicione essas duas diretivas a esse arquivo.
Agora adicione o DIH (Data Import Handler)
3.Crie o arquivo db-data-config.xml
Se o arquivo existir, então ignore, adicione essas linhas a esse arquivo. Como você pode ver na primeira linha, você precisa fornecer as credenciais do seu banco de dados MySQL . O nome do banco de dados, nome de usuário e senha.
4.Modifique o arquivo schema.xml
Adicione isso ao seu schema.xml, como mostrado ..
Indexação
É aqui que está o verdadeiro negócio. Você precisa fazer a indexação dos dados do MySQL para o Solr para fazer uso das consultas do Solr.
Etapa 1: vá para o Painel de administração do Solr
Clique no URL http: // localhost: 8983 / solr no seu navegador. A tela abre assim.
Como o marcador indica, acesse Logon inorder para verificar se alguma das configurações acima levou a erros.
Etapa 2: verifique seus logs
Ok, agora você está aqui. Como você pode, existem muitas mensagens amarelas (AVISOS). Verifique se você não possui mensagens de erro marcadas em vermelho. Anteriormente, em nossa configuração, adicionamos uma consulta de seleção em nosso db-data-config.xml , digamos que se houvesse algum erro nessa consulta, ela seria exibida aqui.
Tudo bem, sem erros. Estamos prontos para ir. Vamos escolher collection1 da lista como representada e selecionar Dataimport
Etapa 3: DIH (manipulador de importação de dados)
Usando o DIH, você se conectará ao MySQL do Solr através do arquivo de configuração db-data-config.xml da interface do Solr e recuperará os 10 registros do banco de dados indexado no Solr .
Para fazer isso, escolha a importação completa e marque as opções Limpar e confirmar . Agora clique em Executar como mostrado.
Como alternativa, você também pode usar uma consulta direta de importação completa como essa.
Depois que você clica em Executar , o Solr começa a indexar os registros, se houver algum erro, ele indicaria Falha na indexação e você precisará voltar à seção Log para ver o que deu errado.
Supondo que não haja erros nessa configuração e se a indexação for concluída com êxito., Você receberá esta notificação.
Etapa 4: executando consultas Solr
Parece que tudo correu bem, agora você pode usar as consultas do Solr para consultar os dados que foram indexados. Clique na consulta à esquerda e pressione Executar botão na parte inferior.
Você verá os registros indexados, como mostrado.
A consulta Solr correspondente para listar todos os registros é
Bem, lá estão todos os 10 registros indexados. Digamos, precisamos apenas de nomes começando com Ja ; nesse caso, você precisa segmentar o nome da coluna
solr_name
; portanto, sua consulta é assim.É assim que você escreve as consultas do Solr . Para ler mais sobre isso, confira este belo artigo .
fonte
Estou analisando a pesquisa de texto completo do PostgreSQL no momento e ela possui todos os recursos corretos de um mecanismo de pesquisa moderno, caracteres estendidos realmente bons e suporte multilíngue, boa integração com campos de texto no banco de dados.
Mas ele não possui operadores de pesquisa fáceis de usar como + ou AND (usa & |!) E não estou entusiasmado com a forma como funciona no site de documentação. Embora tenha negrito dos termos de correspondência nos snippets de resultados, o algoritmo padrão para o qual os termos de correspondência não são bons. Além disso, se você deseja indexar rtf, PDF, MS Office, você precisa encontrar e integrar um conversor de formato de arquivo.
OTOH, é muito melhor do que a pesquisa de texto do MySQL, que nem sequer indexa palavras de três letras ou menos. É o padrão para a pesquisa MediaWiki, e realmente acho que não é bom para os usuários finais: http://www.searchtools.com/analysis/mediawiki-search/
Em todos os casos que vi, Lucene / Solr e Sphinx são realmente ótimas . Eles são um código sólido e evoluíram com melhorias significativas na usabilidade, portanto, as ferramentas estão lá para criar uma pesquisa que satisfaça quase todo mundo.
para SHAILI - SOLR inclui a biblioteca de códigos de pesquisa Lucene e possui os componentes para ser um bom mecanismo de pesquisa independente.
fonte
Tsearch
. Mas o Tsearch não suporta a pesquisa de frases. Ainda está na lista TODO deles sai.msu.su/~megera/wiki/FTS_Todo .Apenas meus dois centavos para esta pergunta muito antiga. Eu recomendo dar uma olhada no ElasticSearch .
As vantagens sobre outros mecanismos de STF (pesquisa de texto completo) são:
Estamos usando esse mecanismo de pesquisa em nosso projeto e estamos muito felizes com ele.
fonte
O SearchTools-Avi disse "Pesquisa de texto no MySQL, que nem sequer indexa palavras de três letras ou menos".
Para sua informação, o comprimento mínimo da palavra em texto completo do MySQL é ajustável desde pelo menos o MySQL 5.0. Google 'mysql fulltext min length' para instruções simples.
Dito isto, o texto completo do MySQL tem limitações: por um lado, fica lento para atualizar quando você atinge um milhão de registros, aproximadamente ...
fonte
Eu adicionaria mnoGoSearch à lista. Solução extremamente eficiente e flexível, que funciona como o Google: o indexador busca dados de vários sites, você pode usar critérios básicos ou inventar seus próprios ganchos para obter a máxima qualidade de pesquisa. Também poderia buscar os dados diretamente do banco de dados.
A solução não é tão conhecida hoje, mas atende às necessidades máximas. Você pode compilá-lo e instalá-lo ou em um servidor autônomo ou mesmo no servidor principal. Ele não precisa de tantos recursos quanto o Solr, como está escrito em C e funciona perfeitamente mesmo em pequenos servidores.
No começo, você precisa compilar você mesmo, portanto, requer algum conhecimento. Eu fiz um pequeno script para o Debian, o que poderia ajudar. Quaisquer ajustes são bem-vindos.
Como você está usando a estrutura do Django, você pode usar um cliente PHP no meio ou encontrar uma solução em Python, eu vi alguns artigos .
E, é claro, o mnoGoSearch é de código aberto, GNU GPL.
fonte