ElasticSearch, Sphinx, Lucene, Solr, Xapian. Qual se encaixa para qual uso? [fechadas]
431
Atualmente, estou olhando para outros métodos de pesquisa, em vez de ter uma enorme consulta SQL. Vi o elasticsearch recentemente e brinquei com whoosh (uma implementação em Python de um mecanismo de pesquisa).
Realmente não entendo pessoas que fecham uma pergunta tão CONSTRUTIVA. Tais questões são realmente importante ...
Gizzmo
2
Também estão movendo a pergunta-alvo.
Amirouche 17/09/2015
Respostas:
787
Como criador do ElasticSearch, talvez eu possa lhe dar alguns argumentos sobre o motivo pelo qual fui adiante e o criei em primeiro lugar :).
Usar o Lucene puro é desafiador. Há muitas coisas que você precisa cuidar, se você quer realmente ter um bom desempenho, e também é uma biblioteca, portanto, não há suporte distribuído, é apenas uma biblioteca Java incorporada que você precisa manter.
Em termos de usabilidade do Lucene, quando (quase 6 anos) eu criei o Compass. Seu objetivo era simplificar o uso do Lucene e tornar o Lucene cotidiano mais simples. O que eu encontrei várias vezes é o requisito de poder ter o Compass distribuído. Comecei a trabalhar nele a partir do Compass, integrando soluções de grade de dados como GigaSpaces, Coherence e Terracotta, mas não é suficiente.
Em sua essência, uma solução Lucene distribuída precisa ser fragmentada. Além disso, com o avanço do HTTP e JSON como APIs onipresentes, significa que uma solução em que muitos sistemas diferentes com idiomas diferentes podem ser facilmente usados.
Por isso fui em frente e criei o ElasticSearch. Ele possui um modelo distribuído muito avançado, fala JSON nativamente e expõe muitos recursos avançados de pesquisa, todos expressos de maneira uniforme por meio do JSON DSL.
O Solr também é uma solução para expor um servidor de indexação / pesquisa por HTTP, mas eu argumentaria que o ElasticSearch fornece um modelo distribuído e uma facilidade de uso muito superiores (embora atualmente não haja alguns dos recursos de pesquisa, mas não por muito tempo, e em qualquer Nesse caso, o plano é incluir todos os recursos do Compass no ElasticSearch). É claro que sou tendencioso, desde que criei o ElasticSearch, então você pode precisar verificar por si mesmo.
Quanto ao Sphinx, eu não o usei, então não posso comentar. O que posso referir é sobre este tópico no fórum da Sphinx, que acho que prova o modelo distribuído superior do ElasticSearch.
Obviamente, o ElasticSearch possui muito mais recursos do que apenas ser distribuído. Na verdade, é construído com uma nuvem em mente. Você pode verificar a lista de recursos no site.
"Você sabe, para pesquisa". +1 para Hudsucker Proxy. Além disso, estou intrigado com o software;)
Shabbyrobe
7
Além disso, o vídeo foi muito bem feito. Você deve adicionar mais alguns!
Shabbyrobe
5
Bom, eu achei que eu possa usar ElasticSearch livre com heroku, em vez de usar algo como Solr que custa dinheiro ...
hellomello
3
O ElasticSearch usa uma grande quantidade de 230 MB de RAM no Ubuntu de 64 bits após uma nova instalação sem dados. Eu realmente gostaria que o Elasticsearch pudesse ser executado em VPS menores como PostgreSQL ou Redis.
Xeoncross
@Xeoncross, como você conseguiu fazê-lo funcionar? Eu tenho 1GB de RAM VPS, eu sempre chegar não pode alocar erro de memória ..
Mohammed Noureldin
67
Eu usei Sphinx, Solr e Elasticsearch. O Solr / Elasticsearch é construído sobre o Lucene. Ele adiciona muitas funcionalidades comuns: API do servidor Web, lapidação, cache, etc.
Se você quiser apenas ter uma configuração simples de pesquisa de texto completo, o Sphinx é uma escolha melhor.
Se você quiser personalizar sua pesquisa, Elasticsearch e Solr são as melhores opções. Eles são muito extensíveis: você pode escrever seus próprios plugins para ajustar a pontuação dos resultados.
Usamos o Lucene regularmente para indexar e pesquisar dezenas de milhões de documentos. As pesquisas são rápidas o suficiente e usamos atualizações incrementais que não demoram muito tempo. Demorou algum tempo para chegar aqui. Os pontos fortes do Lucene são sua escalabilidade, uma grande variedade de recursos e uma comunidade ativa de desenvolvedores. Usar o Lucene simples requer programação em Java.
Se você está começando de novo, a ferramenta para você na família Lucene é o Solr , que é muito mais fácil de configurar do que o Lucene, e tem quase todo o poder de Lucene. Pode importar documentos de banco de dados facilmente. O Solr é escrito em Java, portanto, qualquer modificação do Solr requer conhecimento de Java, mas você pode fazer muito apenas ajustando os arquivos de configuração.
Eu também ouvi coisas boas sobre o Sphinx, especialmente em conjunto com um banco de dados MySQL. Ainda não o usei.
IMO, você deve escolher de acordo com:
A funcionalidade requerida - por exemplo, você precisa de um tradutor francês? Lucene e Solr têm um, eu não sei sobre os outros.
Proficiência na linguagem de implementação - Não toque em Java Lucene se você não conhece Java. Você pode precisar de C ++ para fazer coisas com o Sphinx. O Lucene também foi portado para outros idiomas . Isso é importante principalmente se você deseja estender o mecanismo de pesquisa.
Facilidade de experimentação - acredito que Solr é melhor nesse aspecto.
Interface com outro software - o Sphinx possui uma boa interface com o MySQL. O Solr suporta interfaces ruby, XML e JSON como um servidor RESTful. O Lucene apenas fornece acesso programático através de Java. Compass e Hibernate Search são invólucros do Lucene que o integram em estruturas maiores.
você levantou uma noção importante de que um mecanismo de pesquisa deve ser adaptável.
dzen 16/02/10
1
Eu nunca usei o Xapian. Parece uma boa biblioteca de pesquisa cujos recursos estão em pé de igualdade com os de Lucene. Novamente, o que mais importa são as necessidades de seu aplicativo, o ambiente em que você deseja que o mecanismo de pesquisa seja executado, sua proficiência na linguagem de implementação (C ++ na pesquisa Xapian, com ligações a muitos outros idiomas) e quão personalizável é o mecanismo.
usar o seguinte
21
Utilizamos o Sphinx em um projeto de Pesquisa Vertical com mais de 10.000.000 de registros MySql e mais de 10 bancos de dados diferentes. Possui excelente suporte ao MySQL e alto desempenho na indexação, a pesquisa é rápida, mas talvez um pouco menor que a Lucene. No entanto, é a escolha certa se você precisar indexar rapidamente todos os dias e usar um banco de dados MySQL.
source post_source
{
type = mysql
sql_host = localhost
sql_user = ***
sql_pass = ***
sql_db = ***
sql_port = 3306
sql_query_pre = SET NAMES utf8
# query before fetching rows to index
sql_query = SELECT *, id AS pid, CRC32(safetag) as safetag_crc32 FROM hb_posts
sql_attr_uint = pid
# pid (as 'sql_attr_uint') is necessary for sphinx
# this field must be unique
# that is why I like sphinx
# you can store custom string fields into indexes (memory) as well
sql_field_string = title
sql_field_string = slug
sql_field_string = content
sql_field_string = tags
sql_attr_uint = category
# integer fields must be defined as sql_attr_uint
sql_attr_timestamp = date
# timestamp fields must be defined as sql_attr_timestamp
sql_query_info_pre = SET NAMES utf8
# if you need unicode support for sql_field_string, you need to patch the source
# this param. is not supported natively
sql_query_info = SELECT * FROM my_posts WHERE id = $id
}
index posts
{
source = post_source
# source above
path = /var/data/posts
# index location
charset_type = utf-8
}
Script de teste:
<?php
require "sphinxapi.php";
$safetag = $_GET["my_post_slug"];
// $safetag = preg_replace("/[^a-z0-9\-_]/i", "", $safetag);
$conf = getMyConf();
$cl = New SphinxClient();
$cl->SetServer($conf["server"], $conf["port"]);
$cl->SetConnectTimeout($conf["timeout"]);
$cl->setMaxQueryTime($conf["max"]);
# set search params
$cl->SetMatchMode(SPH_MATCH_FULLSCAN);
$cl->SetArrayResult(TRUE);
$cl->setLimits(0, 1, 1);
# looking for the post (not searching a keyword)
$cl->SetFilter("safetag_crc32", array(crc32($safetag)));
# fetch results
$post = $cl->Query(null, "post_1");
echo "<pre>";
var_dump($post);
echo "</pre>";
exit("done");
?>
Resultado da amostra:
[array] =>
"id" => 123,
"title" => "My post title.",
"content" => "My <p>post</p> content.",
...
[ and other fields ]
Tempo de consulta da esfinge:
0.001 sec.
Tempo de consulta da esfinge (1k simultâneo):
=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)
Tempo de consulta do MySQL:
"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.
Tempo de consulta do MySQL (1k simultâneo):
"SELECT * FROM my_posts WHERE id = 123;"
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)
-1 porque "Meu comentário está aguardando moderação." e outros também veem o link dos grupos do Google acima #
Karussell
1
-1, mais de um ano depois, nenhum comentário é permitido nesse segmento, eu consideraria seriamente ignorá-lo completamente.
JAR.JAR.beans
7
Lucene é legal e tudo, mas seu conjunto de palavras de parada é horrível. Eu tive que adicionar manualmente uma tonelada de palavras de parada ao StopAnalyzer.ENGLISH_STOP_WORDS_SET apenas para colocá-lo em qualquer lugar perto de utilizável.
Eu não usei o Sphinx, mas sei que as pessoas juram por sua velocidade e proporção quase mágica de "facilidade de instalação para grandiosidade".
Como o caso da busca elástica, foi concebida para ser muito mais fácil de usar do que lucene / solr. Também inclui um sistema de pontuação muito flexível que pode ser ajustado sem reindexar.
Respostas:
Como criador do ElasticSearch, talvez eu possa lhe dar alguns argumentos sobre o motivo pelo qual fui adiante e o criei em primeiro lugar :).
Usar o Lucene puro é desafiador. Há muitas coisas que você precisa cuidar, se você quer realmente ter um bom desempenho, e também é uma biblioteca, portanto, não há suporte distribuído, é apenas uma biblioteca Java incorporada que você precisa manter.
Em termos de usabilidade do Lucene, quando (quase 6 anos) eu criei o Compass. Seu objetivo era simplificar o uso do Lucene e tornar o Lucene cotidiano mais simples. O que eu encontrei várias vezes é o requisito de poder ter o Compass distribuído. Comecei a trabalhar nele a partir do Compass, integrando soluções de grade de dados como GigaSpaces, Coherence e Terracotta, mas não é suficiente.
Em sua essência, uma solução Lucene distribuída precisa ser fragmentada. Além disso, com o avanço do HTTP e JSON como APIs onipresentes, significa que uma solução em que muitos sistemas diferentes com idiomas diferentes podem ser facilmente usados.
Por isso fui em frente e criei o ElasticSearch. Ele possui um modelo distribuído muito avançado, fala JSON nativamente e expõe muitos recursos avançados de pesquisa, todos expressos de maneira uniforme por meio do JSON DSL.
O Solr também é uma solução para expor um servidor de indexação / pesquisa por HTTP, mas eu argumentaria que o ElasticSearch fornece um modelo distribuído e uma facilidade de uso muito superiores (embora atualmente não haja alguns dos recursos de pesquisa, mas não por muito tempo, e em qualquer Nesse caso, o plano é incluir todos os recursos do Compass no ElasticSearch). É claro que sou tendencioso, desde que criei o ElasticSearch, então você pode precisar verificar por si mesmo.
Quanto ao Sphinx, eu não o usei, então não posso comentar. O que posso referir é sobre este tópico no fórum da Sphinx, que acho que prova o modelo distribuído superior do ElasticSearch.
Obviamente, o ElasticSearch possui muito mais recursos do que apenas ser distribuído. Na verdade, é construído com uma nuvem em mente. Você pode verificar a lista de recursos no site.
fonte
Eu usei Sphinx, Solr e Elasticsearch. O Solr / Elasticsearch é construído sobre o Lucene. Ele adiciona muitas funcionalidades comuns: API do servidor Web, lapidação, cache, etc.
Se você quiser apenas ter uma configuração simples de pesquisa de texto completo, o Sphinx é uma escolha melhor.
Se você quiser personalizar sua pesquisa, Elasticsearch e Solr são as melhores opções. Eles são muito extensíveis: você pode escrever seus próprios plugins para ajustar a pontuação dos resultados.
Alguns exemplos de uso:
fonte
Usamos o Lucene regularmente para indexar e pesquisar dezenas de milhões de documentos. As pesquisas são rápidas o suficiente e usamos atualizações incrementais que não demoram muito tempo. Demorou algum tempo para chegar aqui. Os pontos fortes do Lucene são sua escalabilidade, uma grande variedade de recursos e uma comunidade ativa de desenvolvedores. Usar o Lucene simples requer programação em Java.
Se você está começando de novo, a ferramenta para você na família Lucene é o Solr , que é muito mais fácil de configurar do que o Lucene, e tem quase todo o poder de Lucene. Pode importar documentos de banco de dados facilmente. O Solr é escrito em Java, portanto, qualquer modificação do Solr requer conhecimento de Java, mas você pode fazer muito apenas ajustando os arquivos de configuração.
Eu também ouvi coisas boas sobre o Sphinx, especialmente em conjunto com um banco de dados MySQL. Ainda não o usei.
IMO, você deve escolher de acordo com:
fonte
Utilizamos o Sphinx em um projeto de Pesquisa Vertical com mais de 10.000.000 de registros MySql e mais de 10 bancos de dados diferentes. Possui excelente suporte ao MySQL e alto desempenho na indexação, a pesquisa é rápida, mas talvez um pouco menor que a Lucene. No entanto, é a escolha certa se você precisar indexar rapidamente todos os dias e usar um banco de dados MySQL.
fonte
Um experimento para comparar ElasticSearch e Solr
fonte
Meu sphinx.conf
Script de teste:
Resultado da amostra:
Tempo de consulta da esfinge:
Tempo de consulta da esfinge (1k simultâneo):
Tempo de consulta do MySQL:
Tempo de consulta do MySQL (1k simultâneo):
fonte
A única comparação de desempenho elasticsearch vs solr que consegui encontrar até agora está aqui:
Solr vs elasticsearch Deathmatch!
fonte
Lucene é legal e tudo, mas seu conjunto de palavras de parada é horrível. Eu tive que adicionar manualmente uma tonelada de palavras de parada ao StopAnalyzer.ENGLISH_STOP_WORDS_SET apenas para colocá-lo em qualquer lugar perto de utilizável.
Eu não usei o Sphinx, mas sei que as pessoas juram por sua velocidade e proporção quase mágica de "facilidade de instalação para grandiosidade".
fonte
Tente indextank.
Como o caso da busca elástica, foi concebida para ser muito mais fácil de usar do que lucene / solr. Também inclui um sistema de pontuação muito flexível que pode ser ajustado sem reindexar.
fonte