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).

Você pode dar razões para suas escolhas?





167
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.


38
"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.

Alguns exemplos de uso:

  • Esfinge: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Quadrangular, Github

63

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.

1
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.



13

Meu sphinx.conf

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)

Você tentou a pesquisa sobre esfinge ou elástico?
dzen

2
@ Dzen esta é esfinge; ele está usando a consulta mysql como uma comparação das velocidades de execução da consulta.
Mr.B

8

A única comparação de desempenho elasticsearch vs solr que consegui encontrar até agora está aqui:

Solr vs elasticsearch Deathmatch!


1
isso é ruim. ele não apresenta comentários! consulte esta discussão: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell

1
-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".


7

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.


pontuação pode ser tweek em tempo de execução com Solr também
Karussell

agora não há mais indextank #
Karussell

4
LinkdenIn fontes abertas IndexTank, github.com/linkedin/indextank-engine
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.