Comparação do motor de busca de texto completo-Luceno, Esfinge, Postgresql, MySQL?

Estou a construir um site do Django e estou à procura de um motor de busca.

alguns candidatos:

  • Luceno / Luceno com bússola / Solr

  • Esfinge

  • pesquisa de texto integral do Postgresql

  • pesquisa de texto completo incorporada no MySQl

critérios de selecção:

  • relevância dos resultados e classificação
  • procura e indexação da velocidade
  • facilidade de utilização e facilidade de integração com Django
  • os recursos necessários-o site será hospedado num VPS , por isso, idealmente, o motor de busca não exigiria muita RAM e CPU
  • escalabilidade
  • características extras como " você quis dizer?", pesquisas relacionadas, etc
Qualquer um que tenha tido experiência com os motores de busca acima, ou outros motores que não estejam na lista, gostaria de ouvir as suas opiniões.

editar: quanto às necessidades de indexação, como os utilizadores continuam a introduzir dados no site, esses dados precisariam de a ser indexado continuamente. Não tem que ser em tempo real, mas idealmente novos dados apareceriam no índice com um atraso não superior a 15 - 30 minutos

Author: ajreal, 2009-04-10

8 answers

É bom ver alguém a falar da Lucene, porque não faço ideia disso. Esfinge, por outro lado, eu sei muito bem, então vamos ver se posso ajudar.
  • a classificação de relevância do resultado é a predefinida. Você pode configurar sua própria ordenação se desejar,e dar campos específicos mais ponderações.
  • A velocidade de indexação é super rápida, porque fala directamente para a base de dados. Qualquer lentidão virá de consultas SQL complexas e chaves estrangeiras não indexadas e outros tais problemas. Também nunca reparei em lentidão na procura. Sou um tipo dos Rails, por isso não faço ideia de como é fácil implementar com o Django. Há uma API Python que vem com a fonte Esfinge embora.
  • o servidor do serviço de pesquisa (searchd) é bastante baixo na utilização da memória - e você pode definir limites em quanta memória o processo de indexação também usa.
  • A escalabilidade é onde o meu conhecimento é mais vago, mas é fácil copiar ficheiros de índice para múltiplas máquinas e executar vários daemons searchd. A impressão geral que eu tenho de outros embora é que é muito bom sob alta carga, então escalá-lo para fora através de várias máquinas não é algo que precisa ser tratado.
  • não há suporte para 'did-you-mean', etc-Embora estes possam ser feitos com outras ferramentas facilmente o suficiente. Sphinx faz stem words though using dictionaries, so 'driving' and ' drive '(for example) would be considered the same in searchs.
  • Esfinge no entanto, não permite atualizações parciais de índices para dados de campo. A abordagem comum a isso é manter um índice delta com todas as mudanças recentes, e re-indexá-lo após cada mudança (e esses novos resultados aparecem dentro de um segundo ou dois). Por causa da pequena quantidade de dados, isso pode levar uma questão de segundos. Você ainda vai precisar de re-indexar o conjunto de dados principal regularmente embora (embora quão regularmente depende da volatilidade dos seus dados - todos os dias? a cada hora?). A velocidade de indexação rápida mantém mas isto é tudo muito indolor.
Não faço ideia de como isto é aplicável à sua situação, mas o Evan Weaver comparou algumas das opções de busca dos trilhos comuns (Esfinge, Furão (um porto de Lucene para Ruby) e Solr), executando alguns parâmetros de referência. Pode ser útil, acho eu. Não mexi nas profundezas da busca de texto completo do MySQL, mas sei que não compete em termos de velocidade nem em termos de recursos com Esfinge, Lucene ou Solr.
 161
Author: pat, 2009-04-10 15:08:56
Não conheço a Esfinge, mas quanto ao Lucene vs a base de dados, acho que o desempenho do Lucene é incomparável. Você deve ser capaz de fazer quase qualquer pesquisar em menos de 10 ms, não importa quantos registros você tem que procurar, desde que você tenha configurado o Lucene índice corretamente. Mas aí vem o maior obstáculo: pessoalmente, acho que integrar Lucene em seu projeto não é fácil. Claro, não é muito difícil configurá-lo para que você possa fazer algum básico procure, mas se você quiser aproveitar ao máximo, com o desempenho ideal, então você definitivamente precisa de um bom livro sobre Lucene.

Quanto aos requisitos da CPU & RAM, realizar uma pesquisa em Lucene não tarefa muito a sua CPU, embora indexar os seus dados seja, embora você não faça isso com muita frequência (talvez uma ou duas vezes por dia), então isso não é um grande obstáculo.

Ele não responde a todas as suas perguntas, mas em resumo, se você tem um monte de dados para pesquisar, e você quer um grande desempenho, então Acho que a Lucene é definitivamente o caminho a seguir. Se você não vai ter que muitos dados para pesquisar, então você pode muito bem ir para uma pesquisa de banco de dados de texto completo. Configurar uma pesquisa de texto completo MySQL é definitivamente mais fácil no meu livro.
 82
Author: Razzie, 2009-04-29 18:23:36
Estou surpreendido por não haver mais informações sobre o Solr. Solr é bastante semelhante à Esfinge, mas tem características mais avançadas (AFAIK como eu não usei a Esfinge -- só leia sobre isso).

A resposta no link abaixo detalha algumas coisas sobre a Esfinge que também se aplica a Solr. Comparação do motor de busca de texto completo-Luceno, Esfinge, Postgresql, MySQL?

O Solr também apresenta as seguintes características adicionais:

  1. suportes replicação
  2. múltiplos núcleos (pense neles como bases de dados separadas com a sua própria configuração e os seus próprios índices)
  3. buscas booleanas
  4. realce de palavras-chave (bastante fácil de fazer no código de aplicação, se você tem regex-fu; no entanto, por que não deixar uma ferramenta especializada fazer um trabalho melhor para você) {[[11]}
  5. actualizar o índice através de XML ou de um ficheiro delimitado
  6. Comunique-se com o servidor de pesquisa através de HTTP (pode até devolver o Json, PHP/Ruby/Python nativo)
  7. PDF, Word indexação dos documentos
  8. campos dinâmicos
  9. facetas
  10. campos agregados
  11. parar palavras, sinónimos, etc.
  12. Mais assim...
  13. Índice directamente da base de dados com consultas personalizadas
  14. Auto-sugerir
  15. Auto-Aquecimento Da 'Cache'
  16. indexação rápida ( comparar com os tempos de indexação de texto completo do MySQL) -- Lucene usa um formato binário de índice invertido.
  17. reforço (regras personalizadas para aumentar a relevância de uma determinada palavra-chave ou frase, etc.)
  18. pesquisas em campo (se um utilizador de pesquisa conhece o campo que quer procurar, restringem a sua pesquisa escrevendo o campo, então o valor, e só esse campo é pesquisado em vez de tudo -- uma experiência de utilizador muito melhor)
[[1]}BTW, há toneladas mais características; no entanto, eu listei apenas as características que eu realmente usei na produção. BTW, fora da caixa, MySQL suporta #1, #3, e #11 (limitado) na lista acima. Para as características que você é à procura de uma base de dados relacional, não vai ser suficiente. Eliminava-os imediatamente. Além disso, outro benefício é que Solr (bem, Lucene na verdade) é uma base de dados de documentos (por exemplo, NoSQL) tantos dos benefícios de qualquer outra base de dados de documentos podem ser realizados com Solr. Em outras palavras, você pode usá-lo para mais do que apenas busca (ou seja, desempenho). Seja criativo com ele:)
 59
Author: Wil Moore III, 2017-05-23 12:26:17

Apache Solr


Para além de responder às perguntas do OP, deixe-me dar-lhe algumas informações sobre Solr Apache de simples introdução a instalação pormenorizada e implementação.
Introdução Simples

qualquer um que tenha tido experiência com os motores de busca acima, ou outro os motores não estão na lista. adorava ouvir a tua voz. parecer.

O Solr não deve ser usado para resolver problemas em tempo real. Para os motores de busca, o Solr é basicamente um jogo e funciona perfeitamente .

Solr Funciona bem em aplicações web de alto tráfego ( li algures que não é adequado para isto, mas estou a apoiar essa afirmação ). Utiliza a RAM, não a CPU.

  • relevância dos resultados e classificação

A o impulso ajuda-o a classificar os seus resultados aparecem no topo. Digo, você está tentando procurar um nome john nos campos nome e sobrenome, e pretende dar relevância para o nome campo, em seguida, você precisará impulso a nome campo, como mostrado.

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

Como pode ver, o campo do nome próprioé reforçado com uma pontuação de 2.

Mais em Solrelevancy

  • procura e indexação da velocidade
A velocidade é incrivelmente rápida e não há compromisso. A razão pela qual me mudei para Solr.

Em relação à velocidade de indexação, o Solr também consegue lidar com ligações das tabelas da sua base de dados. Uma junção superior e complexa afecta a velocidade de indexação. No entanto, um enorme RAM ([31]}pode facilmente resolver esta situação.

A quanto maior a RAM, mais rápida é a velocidade de indexação de Solr.

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

Nunca tentou integrar Solr e Django, no entanto, você pode conseguir fazer isso com Palheiro. Encontrei um artigo interessante sobre o mesmo e aqui está o github para ele.

    ([69]) os recursos necessários-o site será hospedado em um VPS, então idealmente o o motor de busca não exigiria muita RAM e CPU.

Solr reproduz-se em RAM, por isso, se a RAM é alta, não tens de te preocupar com Solr.

O uso de RAM do Solr dispara sobre a indexação completa Se você tiver alguns bilhões de registros, você poderia fazer uso inteligente das Importações Delta para resolver esta situação. Como explicado, Solr é apenas uma solução quase em tempo real.

  • escalabilidade

Solr é altamente escalável. Dê uma olhada em SolrCloud . Algumas das suas principais características.

  • cacos (ou sharding é o conceito de distribuição do Índice entre várias máquinas, digamos se o seu índice cresceu demasiado)
  • balanceamento de carga (se Solrj é usado com a nuvem de Solr, toma automaticamente conta da balanceamento de carga usando o seu mecanismo de escala)
  • Pesquisa Distribuída
  • alto Disponibilidade
  • extras como " você quis dizer?", pesquisas relacionadas, etc

Para o cenário acima, você poderia usar o SpellCheckComponent que está embalado com Solr . Existem muitas outras características, O Filtro de Snowballporterfactory ajuda a recuperar registos que dizem que se você digitou, livros em vez de livro , você será apresentado com resultados relacionados com livro


Esta resposta centra-se amplamente em Apache Solr & MySQL . O Django está fora de alcance.

Assumindo que você está sob o ambiente LINUX, você poderia prosseguir para este artigo. (o meu era uma versão Ubuntu 14.04)

Instalação Pormenorizada

Estou A Começar.

Download Apache Solr de aqui. Essa seria a versão é 4.8.1. Você poderia transferir um novo versões, encontrei isto estável.

Depois de baixar o arquivo , extraí-lo para uma pasta à sua escolha. Dizer .. Ou seja lá o que for.. Assim parecerá Downloads/solr-4.8.1/

Na tua linha de comando.. Navegar dentro da pasta

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Então agora estás aqui ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Iniciar o servidor de aplicações Jetty

O Jetty está disponível dentro da pasta de exemplos do directório solr-4.8.1, por isso navegue dentro dela e inicie o Servidor De Aplicações Jetty.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Não fechem o terminal, minimizem-no e deixem-no ficar de lado.

( dica: usar & depois do início.jar para fazer o servidor de Jetty correr no antecedentes)

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

Jato a bombordo à medida.

Ele corre no Porto 8983 como padrão. Podias mudar o porto. aqui ou directamente dentro do ficheiro jetty.xml.

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

Descarregue o JConnector.

Este ficheiro JAR funciona como uma ponte entre O MySQL e o JDBC , descarregue a versão independente da plataforma aqui

Depois de O descarregar, extrai a pasta e copia omysql-connector-java-5.1.31-bin.jar e cola-a na pasta lib.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Criar a tabela MySQL para ser ligada ao Apache Solr

To put Solr to use, você precisa ter algumas tabelas e dados para procurar. Para isso, usaremos MySQL para criar uma tabela e empurrar alguns nomes aleatórios e então poderíamos usar Solrpara nos ligarmos a MySQL e indexar essa tabela e as suas entradas.

1.Estrutura Do Quadro

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.Preencher 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');
Entrar no núcleo e acrescentar as directivas lib

1.Navegar para

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

2.Modificar a solrconfig.xml

Adicione estas duas directivas a este ficheiro..
  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Agora adicione o DIH (Tratamento De Importação de dados)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Criar a configuração db-data-config.ficheiro xml

Se o ficheiro existir, então ignore, adicione estas linhas a esse ficheiro. Como você pode ver a primeira linha, você precisa fornecer as credenciais da sua base de Dados MySQL. O nome da Base de Dados, nome de utilizador e senha.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(dica: você pode ter qualquer número de entidades, mas cuidado com o campo id, se eles são os mesmos, então a indexação será ignorada. )

4.Modificar o esquema.ficheiro xml

Adiciona isto ao teu esquema.xml Como mostrado..
<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Execução

Indexação

É aqui que está o verdadeiro negócio. Você precisa fazer a indexação de dados de MySQL a Solr para fazer uso de consultas Solr.

Passo 1: Ir para o painel de Administração Solr

Carrega no URL http://localhost:8983/solr no seu navegador. O ecrã abre assim.

This is the main Apache Solr Administration Panel

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

Passo 2: Verifique os seus registos

Ok então agora você está aqui, como você pode, Há um monte de mensagens amarelas (avisos). Certifique-se de que não tem mensagens de erro marcadas a vermelho. Anteriormente, na nossa configuração, tínhamos adicionado uma consulta seleta sobre a nossa db-data-config.xml , digamos que se houvesse algum erro nessa consulta, ela teria aparecido aqui.

This is the logging section of your Apache Solr engine

Tudo bem, sem erros. Estamos prontos. Vamos escolher collection1 da lista como representado e seleccionar importação de dados

Passo 3: DIH (Controlador De Importação de dados)

Se usar o DIH, irá ligar-se a MySQL a partir de Solr através do ficheiro de configuração db-data-config.xml da Solr interface e obter os 10 registos da base de dados que é indexada a Solr.

Para fazer isso, escolha full-import, e verifique as opções Clean e Commit . Agora carregue em executar Como mostrado.

Em alternativa, poderá utilizar uma pesquisa directa completa como esta também..

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

The Data Import Handler

Depois de clicares executa, Solr começa a indexar o registros, se houvesse algum erro, ele diria que a indexação falhou e você tem que voltar para a seção Logging para ver o que deu errado.

Assumindo que não existem erros com esta configuração e se a indexação estiver completa com sucesso. receberia esta notificação.

Indexing Success

Passo 4: Iniciar Consultas Solr

Parece que tudo correu bem, agora você poderia usar Solr consultas para consultar os dados que foram indexados. Carregue no botão da consulta à esquerda e depois carregue em Execute em baixo.

Vai ver os registos indexados como mostrado.

A pesquisa correspondente Solr para listar todos os registos é

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

The indexed data

Lá se vão os 10 registos indexados. Diga, só precisamos de nomes a começar com Ja , neste caso, você precisa de apontar o nome da coluna solr_name, por isso a sua consulta vai como presente.
http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

The JSON data starting with Ja*

É assim que escreves as perguntas. Para ler mais sobre isso, confira este artigo .
 55
Author: Shankar Damodaran, 2015-01-19 11:51:34

Estou a olhar para a pesquisa de texto completo PostgreSQL agora, e tem todas as características certas de um motor de busca moderno, muito bom carácter estendido e suporte multilingue, integração agradável apertado com campos de texto na base de dados.

Mas não tem operadores de pesquisa amigáveis como + or e (usa&/!) e eu não estou emocionado com como ele funciona em seu site de documentação. Enquanto ele tem bolding de termos de correspondência nos excertos de resultados, o algoritmo padrão para o qual as condições não são boas. Além disso, se você quiser indexar rtf, PDF, MS Office, você tem que encontrar e integrar um conversor de formato de arquivo.

OTOH, é muito melhor do que a pesquisa de texto MySQL, que nem sequer indexa palavras de três letras ou menos. É o padrão para a pesquisa MediaWiki, e eu realmente acho que não é bom para os usuários finais: http://www.searchtools.com/analysis/mediawiki-search/

Em todos os casos que eu vi, Lucene / Solr e Esfinge são realmente grandes . Eles são um código sólido e evoluíram com melhorias significativas na usabilidade, então as ferramentas estão todas lá para fazer busca que satisfaça quase todos.

Para SHAILI-SOLR inclui a biblioteca de códigos de busca Lucene e tem os componentes para ser um bom motor de busca independente.
 26
Author: SearchTools-Avi, 2009-09-17 22:57:50
Só a minha opinião sobre esta velha pergunta. Recomendo vivamente que se dê uma vista de olhos à pesquisa elastica.
A Elasticsearch é um servidor de pesquisa baseado no Lucene. Ele fornece um motor de busca de texto completo distribuído e multitenante com uma interface Web RESTful e documentos JSON livres de esquemas. Elasticsearch é desenvolvido em Java e é lançado como open source sob os termos da Licença Apache.

As vantagens sobre outros FTS (pesquisa de texto completo) Os motores são:

Estamos a usar este motor de busca no nosso projecto e estamos muito satisfeitos com ele.
 20
Author: vooD, 2014-01-21 19:07:12
SearchTools-Avi disse " MySQL text search, que nem sequer indexa palavras de três letras ou menos."

FYIs, o comprimento da palavra MySQL de texto completo é ajustável desde pelo menos MySQL 5.0. Google 'mysql fulltext min length' para instruções simples.

Dito isto, o MySQL fulltext tem limitações: por um lado, torna-se lento para actualização quando se chega a um milhão de discos, ou assim,..

 10
Author: BJ., 2009-09-28 00:51:39

Eu acrescentaria mnoGoSearch à lista. Solução extremamente executante e flexível, que funciona como Google : indexador obtém dados de vários sites, você pode usar critérios básicos, ou inventar seus próprios Ganchos para ter a máxima qualidade de pesquisa. Também poderia obter os dados diretamente do banco de dados.

A solução não é tão conhecida hoje, mas alimenta as necessidades máximas. Você pode compilá-lo e instalá-lo ou no servidor autônomo, ou mesmo no seu servidor principal, ele não precisa tanto ressources como Solr, como é escrito em C e funciona perfeitamente, mesmo em pequenos servidores.

No início você precisa compilar ele mesmo, então ele requer algum conhecimento. Eu fiz um pequeno script para o Debian, o que poderia ajudar. Quaisquer ajustamentos são bem-vindos.

Como Você está usando Django, Você poderia usar ou PHP cliente no meio, ou encontrar uma solução em Python, eu vi alguns artigos.

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

 2
Author: Fedir RYKHTIK, 2013-06-20 21:06:18