Comparação do motor de busca de texto completo-Luceno, Esfinge, Postgresql, MySQL?
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
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
8 answers
- 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.
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.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:
- suportes replicação
- múltiplos núcleos (pense neles como bases de dados separadas com a sua própria configuração e os seus próprios índices)
- buscas booleanas
- 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]}
- actualizar o índice através de XML ou de um ficheiro delimitado
- Comunique-se com o servidor de pesquisa através de HTTP (pode até devolver o Json, PHP/Ruby/Python nativo) PDF, Word indexação dos documentos
- campos dinâmicos
- facetas
- campos agregados
- parar palavras, sinónimos, etc. Mais assim...
- Índice directamente da base de dados com consultas personalizadas
- Auto-sugerir
- Auto-Aquecimento Da 'Cache'
- 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.
- reforço (regras personalizadas para aumentar a relevância de uma determinada palavra-chave ou frase, etc.)
- 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)
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
A velocidade é incrivelmente rápida e não há compromisso. A razão pela qual me mudei para Solr.
- procura e indexação da velocidade
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)
Estou A Começar.Instalação Pormenorizada
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
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
( 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
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
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.
Como o marcador indica, vá para Logging para verificar se alguma das configurações acima levou a erros.
Passo 2: Verifique os seus registosOk 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.
Tudo bem, sem erros. Estamos prontos. Vamos escolher collection1 da lista como representado e seleccionar importação de dadosPasso 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
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.
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
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
É assim que escreves as perguntas. Para ler mais sobre isso, confira este artigo .
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.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:
- interface repousante
- melhor escalabilidade
- grande comunidade Construído por Lucene programadores
- extensa documentação
- existem muitas bibliotecas de código aberto disponíveis (incluindo Django)
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,..
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.