ElasticSearch, Sphinx, Lucene, Solr, Xapian. Quale si adatta a quale utilizzo? [chiuso]


431

Attualmente sto cercando altri metodi di ricerca piuttosto che avere un'enorme query SQL. Di recente ho visto elasticsearch e ho giocato con whoosh (un'implementazione Python di un motore di ricerca).

Puoi dare dei motivi per le tue scelte?





167
In realtà non capisco le persone che chiudono una domanda COSTRUTTIVA. Tali domande sono davvero importanti ...
Gizzmo,

2
Anche quelli stanno spostando la domanda target.
amirouche,

Risposte:


787

Come creatore di ElasticSearch, forse posso darti qualche ragionamento sul perché sono andato avanti e l'ho creato in primo luogo :).

L'uso di Lucene puro è una sfida. Ci sono molte cose di cui devi fare attenzione se vuoi che funzioni davvero bene, e inoltre, è una libreria, quindi nessun supporto distribuito, è solo una libreria Java incorporata che devi mantenere.

In termini di usabilità di Lucene, già da quando (quasi 6 anni), ho creato Compass. Il suo obiettivo era semplificare l'utilizzo di Lucene e semplificare la vita quotidiana di Lucene. Ciò che ho riscontrato più volte è il requisito per poter distribuire Compass. Ho iniziato a lavorarci da Compass, integrandomi con soluzioni di griglia di dati come GigaSpaces, Coherence e Terracotta, ma non è abbastanza.

Alla base, una soluzione distribuita di Lucene deve essere messa a fuoco. Inoltre, con l'avanzamento di HTTP e JSON come API onnipresenti, significa che è possibile utilizzare facilmente molti sistemi diversi con lingue diverse.

Ecco perché sono andato avanti e ho creato ElasticSearch. Ha un modello distribuito molto avanzato, parla nativamente JSON ed espone molte funzionalità di ricerca avanzate, tutte espresse senza soluzione di continuità tramite JSON DSL.

Solr è anche una soluzione per esporre un server di indicizzazione / ricerca su HTTP, ma direi che ElasticSearch offre un modello distribuito molto superiore e una facilità d'uso (sebbene al momento manchi su alcune delle funzionalità di ricerca, ma non per molto, e in qualsiasi caso, il piano è quello di ottenere tutte le funzionalità Compass in ElasticSearch). Certo, sono di parte, da quando ho creato ElasticSearch, quindi potrebbe essere necessario verificare da soli.

Per quanto riguarda Sphinx, non l'ho usato, quindi non posso commentare. Quello che posso fare riferimento a questo thread nel forum Sphinx, che penso dimostra il modello distribuito superiore di ElasticSearch.

Naturalmente, ElasticSearch ha molte più funzioni rispetto alla semplice distribuzione. In realtà è costruito pensando a una nuvola. È possibile controllare l'elenco delle funzionalità sul sito.


38
"Sai, per la ricerca". +1 per il proxy Hudsucker. Inoltre, sono incuriosito dal software;)
Shabbyrobe

7
Inoltre, il video è stato davvero ben fatto. Dovresti aggiungerne altri!
Shabbyrobe,

5
Bello, ho scoperto che posso usare elasticsearch gratuitamente con Heroku, al contrario di usare qualcosa come Solr che costa denaro ...
hellomello

3
ElasticSearch utilizza un grande 230 MB di RAM su Ubuntu a 64 bit dopo una nuova installazione senza dati. Vorrei davvero che Elasticsearch potesse essere eseguito su VPS più piccoli come PostgreSQL o Redis.
Xeoncross,

@Xeoncross come sei riuscito a farlo funzionare? Ho 1 GB di RAM VPS, ottengo sempre impossibile allocare l'errore di memoria ..
Mohammed Noureldin

67

Ho usato Sphinx, Solr ed Elasticsearch. Solr / Elasticsearch sono costruiti su Lucene. Aggiunge molte funzionalità comuni: API del server Web, sfaccettatura, memorizzazione nella cache, ecc.

Se vuoi solo avere una semplice configurazione di ricerca full-text, Sphinx è la scelta migliore.

Se vuoi personalizzare la tua ricerca, Elasticsearch e Solr sono le scelte migliori. Sono molto estensibili: puoi scrivere i tuoi plugin per regolare il punteggio dei risultati.

Alcuni esempi di utilizzo:

  • Sfinge: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github

63

Usiamo Lucene regolarmente per indicizzare e cercare decine di milioni di documenti. Le ricerche sono abbastanza veloci e utilizziamo aggiornamenti incrementali che non richiedono molto tempo. Ci è voluto del tempo per arrivare qui. I punti di forza di Lucene sono la sua scalabilità, una vasta gamma di funzionalità e una comunità attiva di sviluppatori. L'uso di Lucene nudo richiede la programmazione in Java.

Se stai ricominciando da capo, lo strumento per te nella famiglia Lucene è Solr , che è molto più facile da installare rispetto a Lucene nudo, e ha quasi tutto il potere di Lucene. Può importare facilmente documenti di database. Solr sono scritti in Java, quindi qualsiasi modifica di Solr richiede conoscenze Java, ma puoi fare molto semplicemente modificando i file di configurazione.

Ho anche sentito cose positive su Sphinx, soprattutto in combinazione con un database MySQL. Non l'ho usato, però.

IMO, dovresti scegliere in base a:

  • La funzionalità richiesta - ad esempio, hai bisogno di uno stemmer francese? Lucene e Solr ne hanno uno, non conosco gli altri.
  • Competenza nel linguaggio di implementazione - Non toccare Java Lucene se non si conosce Java. Potresti aver bisogno del C ++ per fare cose con Sphinx. Lucene è stato anche portato in altre lingue . Questo è importante soprattutto se vuoi estendere il motore di ricerca.
  • Facilità di sperimentazione: credo che Solr sia il migliore in questo aspetto.
  • Interfaccia con altri software - Sphinx ha una buona interfaccia con MySQL. Solr supporta le interfacce ruby, XML e JSON come server RESTful. Lucene ti dà solo accesso programmatico tramite Java. Compass e Hibernate Search sono wrapper di Lucene che lo integrano in framework più grandi.

1
hai sollevato l'idea importante che un motore di ricerca deve essere adattabile.
dzen

1
Non ho mai usato Xapian. Sembra una raffinata libreria di ricerca le cui caratteristiche sono alla pari di quelle di Lucene. Ancora una volta, le cose che contano di più sono le esigenze della tua applicazione, l'ambiente in cui vuoi far funzionare il motore di ricerca, la tua competenza nel linguaggio di implementazione (C ++ nella ricerca Xapian, con collegamenti a molte altre lingue) e quanto sia personalizzabile il motore.
Yuval F,

21

Usiamo Sphinx in un progetto di ricerca verticale con oltre 10.000.000 di record MySql e oltre 10 database diversi. Ha un supporto eccellente per MySQL e alte prestazioni sull'indicizzazione, la ricerca è veloce ma forse un po 'meno di Lucene. Tuttavia è la scelta giusta se hai bisogno di indicizzare rapidamente ogni giorno e utilizzare un db MySQL.



13

My 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 di prova:

<?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");
?>

Risultato del campione:

[array] => 
  "id" => 123,
  "title" => "My post title.",
  "content" => "My <p>post</p> content.",
   ...
   [ and other fields ]

Tempo di query Sfinge:

0.001 sec.

Tempo di query Sfinge (1k simultaneo):

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

Tempo di query MySQL:

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

Tempo di query MySQL (1k simultaneo):

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

Hai provato sfinge o elasticsearch?
dzen

2
@dzen questa sfinge di IS; utilizza la query mysql come confronto delle velocità di esecuzione della query.
sig.

8

L'unico confronto delle prestazioni tra elasticsearch e solr che sono stato in grado di trovare finora è qui:

Solr vs elasticsearch Deathmatch!


1
è una brutta cosa. non presenta commenti! vedi questa discussione: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell,

1
-1 perché "Il mio commento è in attesa di moderazione". e anche altri vedono il link di Google Gruppi sopra
Karussell,

1
-1, più di un anno dopo, non sono consentiti commenti su quel thread, prenderei seriamente in considerazione di ignorarlo completamente.
JAR.JAR.beans

7

Lucene è simpatica e tutto, ma la loro parola d'ordine è terribile. Ho dovuto aggiungere manualmente un sacco di parole di stop a StopAnalyzer.ENGLISH_STOP_WORDS_SET solo per renderlo ovunque utilizzabile.

Non ho usato Sphinx ma so che la gente giura per la sua velocità e il rapporto quasi magico tra "facilità di installazione e bellezza".


7

Prova indextank.

Come nel caso della ricerca elastica, è stato concepito per essere molto più facile da usare rispetto a lucene / solr. Include anche un sistema di punteggio molto flessibile che può essere modificato senza reindicizzare.


il punteggio può essere tweek in fase di esecuzione anche con solr
Karussell,

ora non c'è più indextank
Karussell,

4
LinkdenIn open source IndexTank, github.com/linkedin/indextank-engine
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.