ElasticSearch, Sphinx, Lucene, Solr, Xapian. Welches passt für welchen Einsatz? [geschlossen]

431

Ich suche derzeit nach anderen Suchmethoden, anstatt eine große SQL-Abfrage zu haben. Ich sah Elasticsearch vor kurzem und mit gespielt Zischen (eine Python - Implementierung einer Suchmaschine).

Können Sie Gründe für Ihre Wahl (en) angeben?

dzen
quelle
8
Sphinx vs Solr Vergleich: stackoverflow.com/questions/1284083/…
Mauricio Scheffer
9
Lucene vs Solr: stackoverflow.com/questions/1400892/…
Mauricio Scheffer
2
Whoosh v. Solr: stackoverflow.com/questions/3226596/…
Williams
167
Ich verstehe wirklich keine Leute, die eine solche konstruktive Frage schließen. Solche Fragen sind wirklich wichtig ...
Gizzmo
2
Das sind auch bewegende Zielfragen.
Amirouche

Antworten:

787

Als Schöpfer von ElasticSearch kann ich Ihnen vielleicht einige Gründe geben, warum ich es überhaupt erst erstellt habe :).

Die Verwendung von reinem Lucene ist eine Herausforderung. Es gibt viele Dinge, auf die Sie achten müssen, wenn Sie eine wirklich gute Leistung erzielen möchten. Außerdem handelt es sich um eine Bibliothek, also keine verteilte Unterstützung. Es handelt sich lediglich um eine eingebettete Java-Bibliothek, die Sie warten müssen.

In Bezug auf die Benutzerfreundlichkeit von Lucene habe ich vor langer Zeit (seit fast 6 Jahren) Compass erstellt. Ziel war es, die Verwendung von Lucene zu vereinfachen und den Alltag von Lucene zu vereinfachen. Was mir immer wieder begegnet ist, ist die Anforderung, Compass verteilen zu können. Ich habe angefangen, innerhalb von Compass daran zu arbeiten, indem ich Datenrasterlösungen wie GigaSpaces, Coherence und Terracotta integriert habe, aber das reicht nicht aus.

Im Kern muss eine verteilte Lucene-Lösung abgespalten werden. Mit der Weiterentwicklung von HTTP und JSON als allgegenwärtige APIs bedeutet dies auch, dass eine Lösung, mit der viele verschiedene Systeme mit verschiedenen Sprachen problemlos verwendet werden können.

Aus diesem Grund habe ich ElasticSearch erstellt. Es verfügt über ein sehr fortschrittliches verteiltes Modell, spricht JSON nativ und bietet viele erweiterte Suchfunktionen, die alle nahtlos über JSON DSL ausgedrückt werden.

Solr ist auch eine Lösung, um einen Indexierungs- / Suchserver über HTTP verfügbar zu machen, aber ich würde argumentieren, dass ElasticSearch ein viel besseres verteiltes Modell und eine einfache Bedienung bietet (obwohl es derzeit bei einigen Suchfunktionen fehlt, aber nicht lange und in keinem In diesem Fall ist geplant, alle Kompassfunktionen in ElasticSearch zu integrieren. Natürlich bin ich voreingenommen, da ich ElasticSearch erstellt habe. Möglicherweise müssen Sie dies selbst überprüfen.

Was Sphinx betrifft, habe ich es nicht benutzt, daher kann ich keinen Kommentar abgeben. Ich kann Sie auf diesen Thread im Sphinx-Forum verweisen, der meiner Meinung nach das überlegene verteilte Modell von ElasticSearch beweist.

Natürlich bietet ElasticSearch viel mehr Funktionen als nur die Verteilung. Es ist eigentlich mit Blick auf eine Wolke gebaut. Sie können die Funktionsliste auf der Site überprüfen.

kimchy
quelle
38
"Sie wissen, für die Suche". +1 für Hudsucker Proxy. Außerdem bin ich fasziniert von der Software;)
Shabbyrobe
7
Auch das Video war wirklich gut gemacht. Sie sollten noch einige davon hinzufügen!
Shabbyrobe
5
Schön, ich fand, dass ich Elasticsearch kostenlos mit Heroku verwenden kann, im Gegensatz zu Solr, das Geld kostet ...
Hellomello
3
ElasticSearch verwendet nach einer Neuinstallation ohne Daten 230 MB RAM auf 64-Bit-Ubuntu. Ich wünschte wirklich, Elasticsearch könnte auf kleineren VPS wie PostgreSQL oder Redis ausgeführt werden.
Xeoncross
@Xeoncross Wie haben Sie es geschafft, dass es funktioniert? Ich habe 1 GB RAM VPS, ich bekomme immer kann nicht Speicherfehler zuordnen ..
Mohammed Noureldin
67

Ich habe Sphinx, Solr und Elasticsearch verwendet. Solr / Elasticsearch bauen auf Lucene auf. Es werden viele allgemeine Funktionen hinzugefügt: Webserver-API, Facettieren, Zwischenspeichern usw.

Wenn Sie nur eine einfache Volltextsuche einrichten möchten, ist Sphinx die bessere Wahl.

Wenn Sie Ihre Suche überhaupt anpassen möchten, sind Elasticsearch und Solr die bessere Wahl. Sie sind sehr erweiterbar: Sie können Ihre eigenen Plugins schreiben, um die Ergebnisbewertung anzupassen.

Einige Anwendungsbeispiele:

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github
Tommy Chheng
quelle
63

Wir verwenden Lucene regelmäßig, um zig Millionen Dokumente zu indizieren und zu durchsuchen. Die Suche ist schnell genug und wir verwenden inkrementelle Updates, die nicht lange dauern. Wir haben einige Zeit gebraucht, um hierher zu kommen. Die Stärken von Lucene sind seine Skalierbarkeit, eine Vielzahl von Funktionen und eine aktive Community von Entwicklern. Die Verwendung von Bare Lucene erfordert die Programmierung in Java.

Wenn Sie neu anfangen, ist das Werkzeug für Sie in der Lucene-Familie Solr , das viel einfacher einzurichten ist als das reine Lucene und fast die gesamte Macht von Lucene besitzt. Es kann problemlos Datenbankdokumente importieren. Solr sind in Java geschrieben, daher erfordert jede Änderung von Solr Java-Kenntnisse. Sie können jedoch viel tun, indem Sie einfach die Konfigurationsdateien optimieren.

Ich habe auch gute Dinge über Sphinx gehört, insbesondere in Verbindung mit einer MySQL-Datenbank. Habe es aber nicht benutzt.

IMO, sollten Sie wählen nach:

  • Die erforderliche Funktionalität - zB benötigen Sie einen französischen Stemmer? Lucene und Solr haben eine, ich weiß nichts über die anderen.
  • Kenntnisse in der Implementierungssprache - Berühren Sie Java Lucene nicht, wenn Sie Java nicht kennen. Möglicherweise benötigen Sie C ++, um mit Sphinx arbeiten zu können. Lucene wurde auch in andere Sprachen portiert . Dies ist vor allem dann wichtig, wenn Sie die Suchmaschine erweitern möchten.
  • Einfaches Experimentieren - Ich glaube, Solr ist in dieser Hinsicht am besten.
  • Schnittstelle mit anderer Software - Sphinx hat eine gute Schnittstelle zu MySQL. Solr unterstützt Ruby-, XML- und JSON-Schnittstellen als RESTful-Server. Lucene bietet Ihnen nur programmgesteuerten Zugriff über Java. Compass und Hibernate Search sind Wrapper von Lucene, die es in größere Frameworks integrieren.
Yuval F.
quelle
1
Sie haben eine wichtige Vorstellung davon angesprochen, dass eine Suchmaschine anpassungsfähig sein muss.
dzen
1
Ich habe Xapian noch nie benutzt. Es sieht aus wie eine feine Suchbibliothek, deren Funktionen mit denen von Lucene vergleichbar sind. Wichtig sind wiederum Ihre Anwendungsanforderungen, die Umgebung, in der die Suchmaschine ausgeführt werden soll, Ihre Kenntnisse der Implementierungssprache (C ++ in der Xapian-Suche mit Bindungen an viele andere Sprachen) und die Anpassbarkeit der Suchmaschine.
Yuval F
21

Wir verwenden Sphinx in einem vertikalen Suchprojekt mit mehr als 10.000.000 MySQL-Datensätzen und mehr als 10 verschiedenen Datenbanken. Es hat eine hervorragende Unterstützung für MySQL und eine hohe Leistung bei der Indizierung. Die Recherche ist schnell, aber vielleicht etwas weniger als bei Lucene. Es ist jedoch die richtige Wahl, wenn Sie jeden Tag schnell indizieren und eine MySQL-Datenbank verwenden müssen.

Emiliano M.
quelle
13

Meine 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
}

Testskript:

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

Beispielergebnis:

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

Sphinx-Abfragezeit:

0.001 sec.

Sphinx-Abfragezeit (1k gleichzeitig):

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

MySQL-Abfragezeit:

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

MySQL-Abfragezeit (1k gleichzeitig):

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)
Abdullah Aydın
quelle
Haben Sie Sphinx oder Elasticsearch ausprobiert?
dzen
2
@dzen das ist Sphinx; Er verwendet MySQL-Abfragen als Vergleich der Ausführungsgeschwindigkeiten von Abfragen.
mr.b
8

Der einzige Leistungsvergleich zwischen Elasticsearch und Solr, den ich bisher finden konnte, ist hier:

Solr vs elasticsearch Deathmatch!

Gen
quelle
1
das ist schlecht er präsentiert keine Kommentare! Siehe diese Diskussion: groups.google.com/a/elasticsearch.com/group/users/browse_thread/…
Karussell
1
-1, weil "Mein Kommentar wartet auf Moderation." und andere sehen auch den Link zu Google-Gruppen oben
Karussell
1
-1, mehr als ein Jahr später, sind keine Kommentare zu diesem Thread erlaubt, ich würde ernsthaft in Betracht ziehen, ihn komplett zu ignorieren.
JAR.JAR.beans
7

Lucene ist nett und alles, aber ihr Stoppwort ist schrecklich. Ich musste StopAnalyzer.ENGLISH_STOP_WORDS_SET manuell eine Menge Stoppwörter hinzufügen, um es annähernd nutzbar zu machen.

Ich habe Sphinx nicht verwendet, aber ich weiß, dass die Leute auf die Geschwindigkeit und das nahezu magische Verhältnis von "Leichtigkeit der Einrichtung zu Attraktivität" schwören.

Larley
quelle
7

Versuchen Sie es mit Indextank.

Als Fall der elastischen Suche wurde es als viel einfacher zu verwenden als Lucene / Solr konzipiert. Es enthält auch ein sehr flexibles Bewertungssystem, das ohne Neuindizierung angepasst werden kann.

Spitze
quelle
Die Wertung kann auch zur Laufzeit mit Solr erfolgen
Karussell
Jetzt gibt es keinen Indextank mehr
Karussell
4
LinkdenIn Open Source IndexTank, github.com/linkedin/indextank-engine