Pergunta

Atualmente, estou procurando outros métodos de pesquisa, em vez de ter uma enorme consulta SQL. Eu vi Elasticsearch recentemente e brincou com whoosh (Uma implementação do Python de um mecanismo de pesquisa).

Você pode dar motivos para suas opções?

Foi útil?

Solução

Como criador do Elasticsearch, talvez eu possa lhe dar algum raciocínio sobre por que fui em frente e o criei em primeiro lugar :).

Usar Pure Lucene é desafiador. Há muitas coisas que você precisa cuidar, se deseja que realmente tenha 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 todos os dias mais simples. O que me deparei várias vezes é o requisito de ser capaz de distribuir a bússola. Comecei a trabalhar nisso de dentro da Compass, integrando -se com soluções de grade de dados como gigaspaces, coerência e terracota, mas não é suficiente.

Na sua essência, uma solução Lucene distribuída precisa ser fragmentada. Além disso, com o avanço do HTTP e do JSON como APIs onipresentes, isso significa que uma solução que muitos sistemas diferentes com idiomas diferentes podem ser facilmente usados.

É por isso que 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 perfeitamente através do JSON DSL.

Solr também é uma solução para expor um servidor de indexação/pesquisa sobre HTTP, mas eu argumentaria que Elasticsearch Fornece um modelo distribuído muito superior e facilidade de uso (embora atualmente ausente em alguns dos recursos de pesquisa, mas não por muito tempo e, em qualquer caso, o plano é obter tudo Bússola recursos no Elasticsearch). Claro, sou tendencioso, pois criei o Elasticsearch, então você pode precisar verificar por si mesmo.

Quanto à Esfinge, não a usei, então não posso comentar. O que posso me referir é para Este tópico no fórum Sphinx O que eu acho que prova o modelo superior distribuído do Elasticsearch.

Obviamente, o Elasticsearch tem 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.

Outras dicas

Eu usei Sphinx, Solr e Elasticsearch. Solr/Elasticsearch é construído sobre o Lucene. Acrescenta muitas funcionalidades comuns: API do servidor da web, faceting, cache, etc.

Se você deseja ter apenas uma configuração simples de pesquisa de texto completo, a Sphinx é uma escolha melhor.

Se você deseja personalizar sua pesquisa, o Elasticsearch e o 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 usos:

  • Esfinge: craigslist.org
  • Solr: CNET, Netflix, Digg.com
  • Elasticsearch: Foursquare, Github

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 levam muito tempo. Levamos 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 Bare Lucene requer programação em Java.

Se você está começando de novo, a ferramenta para você na família Lucene é Solr, o que é muito mais fácil de montar do que o Lucene nu, e tem quase todo o poder de Lucene. Ele pode importar documentos de banco de dados facilmente. O Solr está escrito em Java, portanto, qualquer modificação do Solr requer conhecimento Java, mas você pode fazer muito apenas ajustando arquivos de configuração.

Também ouvi coisas boas sobre a Sphinx, especialmente em conjunto com um banco de dados MySQL. Não o usei, no entanto.

IMO, você deve escolher de acordo com:

  • A funcionalidade necessária - por exemplo, você precisa de um tronco francês? Lucene e Solr têm um, eu não conheço os outros.
  • Proficiência no idioma de implementação - não toque em Java Lucene se você não conhece Java. Você pode precisar de C ++ para fazer coisas com a Esfinge. Lucene também foi portado para outro línguas. Isso é principalmente importante se você deseja estender o mecanismo de pesquisa.
  • Facilidade de Experimentação - Acredito que Solr é o melhor neste aspecto.
  • Interface com outro software - Sphinx tem uma boa interface com o MySQL. O Solr suporta interfaces Ruby, XML e JSON como um servidor RESTful. O Lucene apenas oferece acesso programático através do Java. Bússola e Pesquisa de hibernação são invólucros do Lucene que o integram em estruturas maiores.

Utilizamos o SPHINX em um projeto de pesquisa vertical com 10.000.000 + dos registros MySQL e 10+ bancos de dados diferentes. Ele tem um excelente apoio ao MySQL e alto desempenho na indexação, a pesquisa é rápida, mas talvez um pouco menos que Lucene. No entanto, é a escolha certa se você precisar de indexação rapidamente todos os dias e usar um dB MySQL.

Um experimento para Compare Elasticsearch e Solr

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 Sphinx:

0.001 sec.

Tempo de consulta Sphinx (1K simultâneo):

=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)

Hora da consulta do MySQL:

"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.

Tempo de consulta MySQL (1k simultâneo):

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)

A única comparação ElasticSearch vs Solr Performance que pude encontrar até agora está aqui:

Solr vs Elasticsearch Deathmatch!

Lucene é bom e tudo, mas o conjunto de palavras de parada é horrível. Eu tive que adicionar manualmente uma tonelada de palavras de parada para stopanalyzer.english_stop_words_set apenas para chegar de qualquer lugar perto de utilizável.

Não usei a Esfinge, mas sei que as pessoas juram por sua velocidade e índice quase mágica "facilidade de configuração para grandiosidade".

Tente INDEXTANK.

Como caso de busca elástica, foi concebido para ser muito mais fácil de usar do que o Lucene/Solr. Ele também inclui um sistema de pontuação muito flexível que pode ser ajustado sem reindexação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top