Comparação do mecanismo de pesquisa de texto completo – Lucene, Sphinx, Postgresql, MySQL?

Estou construindo um site do Django e estou procurando um mecanismo de busca.

Alguns candidatos:

  • Lucene / Lucene com Compass / Solr

  • Esfinge

  • Pesquisa de texto completo integrada do Postgresql

  • Pesquisa de texto completo embutida no MySQl

Critério de seleção:

  • relevância do resultado e sorting
  • velocidade de pesquisa e indexação
  • facilidade de uso e facilidade de integração com o Django
  • requisitos de resources – o site será hospedado em um VPS , então o ideal é que o mecanismo de busca não exija muita memory RAM e CPU
  • escalabilidade
  • resources 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 estejam na lista – adoraria ouvir suas opiniões.

EDIT: Quanto às necessidades de indexação, como os usuários continuam inserindo dados no site, esses dados precisariam ser indexados continuamente. Não precisa ser em tempo real, mas idealmente novos dados apareceriam no índice com não mais do que 15 a 30 minutos de atraso

É bom ver alguém comentando sobre Lucene – porque eu não tenho ideia sobre isso.

Esfinge, por outro lado, eu sei muito bem, então vamos ver se eu posso ser de alguma ajuda.

  • A sorting de relevância do resultado é o padrão. Você pode configurar sua própria sorting, se desejar, e dar a campos específicos pesos mais altos.
  • A velocidade de indexação é super rápida, porque ela fala diretamente com o database. Qualquer lentidão virá de consultas SQL complexas e foreign keys não indexadas e outros problemas. Eu nunca notei qualquer lentidão na busca também.
  • Eu sou um cara do Rails, então não tenho ideia de como é fácil implementar com o Django. Existe uma API Python que vem com a fonte Sphinx.
  • O daemon do serviço de pesquisa (searchd) tem um consumo de memory muito baixo – e você pode definir limites em quanto de memory o processo do indexador também usa.
  • A escalabilidade é onde meu conhecimento é mais superficial – mas é fácil copiar arquivos de índice para várias máquinas e executar vários daemons de pesquisa. A impressão geral que tenho dos outros é que isso é muito bom sob carga alta, então escalá-lo em várias máquinas não é algo que precisa ser tratado.
  • Não há suporte para ‘did-you-mean’, etc – embora isso possa ser feito com outras ferramentas com bastante facilidade. A Esfinge, entretanto, usa palavras como “dictionarys”, por isso “dirigir” e “dirigir” (por exemplo) seriam considerados os mesmos em pesquisas.
  • O Sphinx não permite atualizações de índice parciais para dados de campo. A abordagem comum para isso é manter um índice delta com todas as alterações recentes e indexá-lo novamente após cada alteração (e esses novos resultados aparecem em um segundo ou dois). Devido à pequena quantidade de dados, isso pode levar alguns segundos. Você ainda precisará re-indexar o dataset principal regularmente (embora como regularmente depende da volatilidade de seus dados – todos os dias? A cada hora?). As rápidas velocidades de indexação mantêm isso tudo bem indolor.

Não tenho idéia de como isso se aplica à sua situação, mas Evan Weaver comparou algumas das opções comuns de pesquisa do Rails (Sphinx, Ferret (um port de Lucene para Ruby) e Solr), executando alguns benchmarks. Poderia ser útil, eu acho.

Eu não pesquisei as profundezas da pesquisa de texto completo do MySQL, mas sei que ela não compete em termos de velocidade nem de resources com Sphinx, Lucene ou Solr.

Eu não sei Sphinx, mas quanto ao Lucene vs uma pesquisa de texto completo do database, acho que o desempenho do Lucene é incomparável. Você deve poder realizar quase todas as pesquisas em menos de 10 ms, independentemente de quantos registros pesquisar, desde que tenha configurado o índice do Lucene corretamente.

Aí vem o maior obstáculo: pessoalmente, acho que integrar o Lucene em 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 você quiser tirar o máximo proveito dele, com ótimo desempenho, então você definitivamente precisa de um bom livro sobre Lucene.

Quanto aos requisitos de CPU e RAM, realizar uma pesquisa no Lucene não sobrecarrega muito o seu CPU, embora indexe seus dados, embora você não o faça com muita frequência (talvez uma ou duas vezes por dia), então isso não é muito de um obstáculo.

Ele não responde a todas as suas perguntas, mas em suma, se você tem muitos dados para pesquisar, e quer um ótimo desempenho, então eu acho que Lucene é definitivamente o caminho a percorrer. Se você não vai ter tantos dados para pesquisar, então você também pode procurar por um database de texto completo. Configurar uma pesquisa de texto completo no MySQL é definitivamente mais fácil em meu livro.

Estou surpreso que não haja mais informações postadas sobre Solr. O Solr é bastante semelhante ao Sphinx, mas tem resources mais avançados (AFAIK, como eu não usei o Sphinx – apenas leia sobre ele).

A resposta no link abaixo detalha algumas coisas sobre Sphinx, que também se aplica a Solr. Comparação do mecanismo de pesquisa de texto completo – Lucene, Sphinx, Postgresql, MySQL?

O Solr também fornece os seguintes resources adicionais:

  1. Suporta replicação
  2. Vários núcleos (pense neles como bancos de dados separados com sua própria configuração e índices próprios)
  3. Pesquisas booleanas
  4. Realce de palavras-chave (bastante fácil de fazer no código do aplicativo se você tiver regex-fu; no entanto, por que não permitir que uma ferramenta especializada faça um trabalho melhor para você)
  5. Atualizar índice via XML ou arquivo delimitado
  6. Comunique-se com o servidor de pesquisa via HTTP (pode até mesmo retornar Json, PHP nativo / Ruby / Python)
  7. PDF, indexação de documentos do Word
  8. Campos dynamics
  9. Facetas
  10. Campos agregados
  11. Pare palavras, sinônimos, etc.
  12. Mais como isso…
  13. Indexar diretamente do database com consultas customizadas
  14. Sugerir automaticamente
  15. Autowarming de cache
  16. Indexação rápida (compare com tempos de indexação de pesquisa de texto completo do MySQL) – O Lucene usa um formato de índice invertido binário.
  17. Boosting (regras personalizadas para aumentar a relevância de uma determinada palavra-chave ou frase, etc.)
  18. Pesquisas de campo (se um usuário de pesquisa souber o campo que deseja pesquisar, ele restringirá a pesquisa digitando o campo, depois o valor e SOMENTE esse campo será pesquisado, em vez de tudo – uma experiência de usuário muito melhor)

BTW, existem toneladas mais resources; no entanto, listei apenas os resources que realmente usei na produção. BTW, fora da checkbox, o MySQL suporta # 1, # 3 e # 11 (limitado) na lista acima. Para os resources que você está procurando, um database relacional não o cortará. Eu eliminaria aqueles imediatamente.

Além disso, outro benefício é que o Solr (na verdade, o Lucene) é um database de documentos (por exemplo, NoSQL), portanto, muitos dos benefícios de qualquer outro database 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 🙂

Apache Solr


Além de responder às perguntas do OP, deixe-me lançar algumas ideias sobre o Apache Solr, desde a introdução simples até a instalação e implementação detalhadas .

Introdução simples


Qualquer pessoa que tenha experiência com os mecanismos de pesquisa acima ou com outros mecanismos que não estejam na lista – adoraria ouvir suas opiniões.

O Solr não deve ser usado para resolver problemas em tempo real. Para os motores de busca, o Solr é praticamente um jogo e funciona de forma impecável .

Solr funciona bem em aplicativos web de alto tráfego ( eu li em algum lugar que não é adequado para isso, mas estou fazendo o backup dessa afirmação ). Utiliza a RAM, não a CPU.

  • relevância do resultado e sorting

O impulso ajuda você a classificar seus resultados. Digamos que você está tentando procurar um nome john nos campos firstname e lastname , e você quer dar relevância ao campo firstname , então você precisa aumentar o campo firstname como mostrado.

 http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john 

Como você pode ver, o campo de nome é aumentado com uma pontuação de 2.

Mais sobre SolrRelevancy

  • velocidade de pesquisa e indexação

A velocidade é incrivelmente rápida e não compromete isso. A razão pela qual me mudei para Solr .

Em relação à velocidade de indexação, o Solr também pode manipular JOINS de suas tabelas de database. Um JOIN mais alto e complexo afeta a velocidade de indexação. No entanto, uma enorme configuração de RAM pode resolver facilmente essa situação.

Quanto maior a RAM, mais rápida será a velocidade de indexação do Solr.

  • facilidade de uso e facilidade de integração com o Django

Nunca tentei integrar Solr e Django , mas você pode conseguir fazer isso com o Haystack . Eu encontrei algum artigo interessante sobre o mesmo e aqui está o github para isso.

  • requisitos de resources – o site será hospedado em um VPS, então o ideal é que o mecanismo de busca não exija muita memory RAM e CPU

O Solr se reproduz na RAM, então, se a RAM for alta, você não precisa se preocupar com o Solr .

O uso de RAM do Solr triggers na indexação completa, se você tiver alguns bilhões de registros, você poderia usar as importações da Delta de maneira inteligente para lidar com essa situação. Conforme explicado, o Solr é apenas uma solução quase em tempo real .

  • escalabilidade

O Solr é altamente escalável. Dê uma olhada no SolrCloud . Algumas das principais características do mesmo.

  • Shards (ou sharding é o conceito de distribuir o índice entre várias máquinas, digamos, se seu índice cresceu muito)
  • Balanceamento de carga (se o Solrj for usado com a nuvem Solr, ele automaticamente cuida do balanceamento de carga usando seu mecanismo Round-Robin)
  • Pesquisa Distribuída
  • Alta disponibilidade
  • resources extras, como “você quis dizer?”, pesquisas relacionadas, etc.

Para o cenário acima, você pode usar o SpellCheckComponent que é embalado com o Solr . Há muitos outros resources, o SnowballPorterFilterFactory ajuda a recuperar registros, digamos que se você digitou, livros em vez de livro , você será apresentado com resultados relacionados ao livro .


Esta resposta se concentra amplamente no Apache Solr e MySQL . Django está fora do escopo.

Supondo que você esteja sob o ambiente LINUX, você poderia continuar com este artigo. (o meu foi uma versão Ubuntu 14.04)

Instalação detalhada

Começando

Baixe o Apache Solr daqui . Essa seria a versão 4.8.1 . Você poderia 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 qualquer outra coisa .. Então vai ficar parecido com Downloads/solr-4.8.1/

Em 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 do Jetty

O Jetty está disponível dentro da pasta de exemplos do diretório solr-4.8.1 , 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.

(DICA: Use & after start.jar para fazer o Jetty Server rodar em segundo plano)

Para verificar se o Apache Solr é executado com sucesso, visite este URL no navegador. http: // localhost: 8983 / solr

Executando o Jetty na porta personalizada

Ele é executado na porta 8983 como padrão. Você pode alterar a porta aqui ou diretamente dentro do arquivo jetty.xml .

java -Djetty.port=9091 -jar start.jar

Baixe o JConnector

Este arquivo JAR atua como uma ponte entre o MySQL e o JDBC, faça o download da versão independente da plataforma aqui

Após baixá-lo, extraia a pasta e copie o mysql-connector-java-5.1.31-bin.jar e cole-o 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 colocar Solr para usar, você precisa ter algumas tabelas e dados para procurar. Para isso, vamos usar o MySQL para criar uma tabela e empurrar alguns nomes randoms e, em seguida, podemos usar o Solr para conectar ao MySQL e indexar essa tabela e suas inputs.

Estrutura 1.Table

 CREATE TABLE test_solr_mysql ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45) NULL, created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ); 

2.Popule a tabela acima

 INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland'); 

Entrando no núcleo e adicionando as diretivas lib

1. Navegar para

 shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf 

2.Modificando o solrconfig.xml

Adicione estas duas diretivas a este arquivo.

    

Agora adicione o DIH (Data Import Handler)

   db-data-config.xml   

3.Crie o arquivo db-data-config.xml

Se o arquivo existir, ignore-o, adicione essas linhas a esse arquivo. Como você pode ver a primeira linha, você precisa fornecer as credenciais do seu banco de dados MySQL . O nome do database, nome de usuário e senha.

          

(DICA: Você pode ter qualquer número de entidades, mas cuidado com o campo id, se elas forem iguais, a indexação será ignorada.)

4.Modifique o arquivo schema.xml

Adicione isto ao seu schema.xml como mostrado ..

 id  

Implementação

Indexação

Este é o lugar onde o negócio é real. 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 na URL http: // localhost: 8983 / solr no seu navegador. A canvas se abre assim.

Este é o principal painel de administração do Apache Solr

Como o marcador indica, vá para Logging inorder para verificar se alguma das configurações acima causou erros.

Etapa 2: verificar seus registros

Ok, então agora você está aqui. Como você pode, há muitas mensagens amarelas (ADVERTÊNCIAS). Certifique-se de que você não tenha mensagens de erro marcadas em vermelho. Anteriormente, em nossa configuração, adicionamos uma consulta select em nosso db-data-config.xml , digamos que se houvesse algum erro nessa consulta, ele teria aparecido aqui.

Esta é a seção de log do seu mecanismo Apache Solr

Tudo bem, sem erros. Nós somos bons para ir. Vamos escolher collection1 da lista como descrito e selecionar Dataimport

Etapa 3: DIH (manipulador de importação de dados)

Usando o DIH, você estará se conectando 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 database que são indexados no Solr .

Para fazer isso, escolha full-import e marque as opções Clean e Commit . Agora clique em Executar como mostrado.

Alternativamente, você poderia usar uma consulta direta de importação completa como esta também.

 http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true 

O manipulador de importação de dados

Depois que você clica em Executar , o Solr começa a indexar os registros, se houver algum erro, ele indicará Falha na Indexação e você terá que voltar para a seção Registro para ver o que deu errado.

Supondo que não haja erros com esta configuração e se a indexação for concluída com sucesso, você receberá esta notificação.

Sucesso de Indexação

Etapa 4: executando consultas do Solr

Parece que tudo correu bem, agora você pode usar o Solr Queries para consultar os dados que foram indexados. Clique na consulta à esquerda e pressione o botão Executar na parte inferior.

Você verá os registros indexados como mostrado.

A consulta Solr correspondente para listar todos os registros é

 http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true 

Os dados indexados

Bem, lá vão todos os 10 registros indexados. Digamos que precisamos apenas de nomes começando com Ja , nesse caso, você precisa direcionar o nome da coluna solr_name , daí sua consulta é assim.

 http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true 

Os dados JSON começando com Ja *

É assim que você escreve Solr Queries. Para ler mais sobre isso, confira este belo artigo .

Eu estou olhando para pesquisa de texto completo PostgreSQL agora, e tem todas as características certas de um mecanismo de pesquisa moderno, muito bom caráter estendido e suporte multilíngüe, boa integração apertada com campos de texto no database.

Mas ele não possui operadores de pesquisa amigáveis, como + ou AND (usa & |!), E não estou muito entusiasmado com a forma como ele funciona em seu site de documentação. Embora tenha um negrito de termos de correspondência nos snippets de resultados, o algoritmo padrão para o qual os termos de correspondência não são ótimos. Além disso, se você quiser indexar rtf, PDF, MS Office, você precisa encontrar e integrar um conversor de formato de arquivo.

OTOH, é bem melhor que a pesquisa de texto do MySQL, que nem sequer indexa palavras de três letras ou menos. É o padrão para a pesquisa no MediaWiki, e eu realmente acho que isso 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 ótimos . Eles são um código sólido e evoluíram com melhorias significativas na usabilidade, por isso as ferramentas estão todas lá para fazer pesquisas que satisfazem quase todos.

para SHAILI – O SOLR inclui a biblioteca de códigos de pesquisa do Lucene e tem os componentes para ser um bom mecanismo de busca autônomo.

Apenas meus dois centavos para esta pergunta muito antiga. Eu recomendo dar uma olhada no ElasticSearch .

O Elasticsearch é um servidor de pesquisa baseado no Lucene. Ele fornece um mecanismo de pesquisa de texto completo distribuído, com capacidade para vários usuários, com uma interface da Web RESTful e documentos JSON sem esquema. Elasticsearch é desenvolvido em Java e é lançado como código aberto sob os termos da Licença Apache.

As vantagens em relação a outros motores FTS (pesquisa de texto completo) são:

  • Interface RESTful
  • Melhor escalabilidade
  • Grande comunidade
  • Construído por desenvolvedores Lucene
  • Extensa documentação
  • Existem muitas bibliotecas de código aberto disponíveis (incluindo o Django)

Estamos usando este mecanismo de busca em nosso projeto e estamos muito felizes com isso.

SearchTools-Avi disse “MySQL text search, que nem sequer indexa palavras de três letras ou menos.”

FYIs, O tamanho mínimo da palavra do MySQL fulltext é 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, é lento para atualizar uma vez que você alcance um milhão de registros ou mais, …

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 uma qualidade de pesquisa máxima. Também poderia buscar os dados diretamente do database.

A solução não é tão conhecida hoje, mas tem necessidades máximas. Você pode compilá-lo e instalá-lo ou em um servidor autônomo, ou até mesmo em seu servidor principal, ele não precisa de tantos resources como o Solr, como está escrito em C e roda perfeitamente, mesmo em servidores pequenos.

No começo Você precisa compilar você mesmo, então 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 o framework Django, você poderia usar ou cliente PHP no meio, ou encontrar uma solução em Python, vi alguns artigos .

E, claro, mnoGoSearch é open source, GNU GPL.