it-swarm.com.de

ElasticSearch, Sphinx, Lucene, Solr, Xapian. Welches passt zu welchem ​​Einsatz?

Ich beschäftige mich derzeit eher mit anderen Suchmethoden als mit einer großen SQL-Abfrage. Ich habe elasticsearch kürzlich gesehen und mit whoosh (a Python Implementierung einer Suchmaschine) gespielt.

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

421
dzen

Als Erfinder von ElasticSearch kann ich Ihnen vielleicht einige Gründe nennen, warum ich es ursprünglich erstellt habe :).

Die Verwendung von reinem Lucene ist eine Herausforderung. Es gibt viele Dinge, auf die Sie achten müssen, wenn Sie möchten, dass es wirklich gut funktioniert, und es ist auch eine Bibliothek, also keine verteilte Unterstützung, es ist nur eine eingebettete Java Bibliothek, die Sie benötigen aufrecht erhalten.

In Bezug auf die Benutzerfreundlichkeit von Lucene habe ich Compass schon vor fast 6 Jahren entwickelt. Ziel war es, die Verwendung von Lucene zu vereinfachen und den Alltag von Lucene zu vereinfachen. Was mir immer wieder aufgefallen ist, ist das Erfordernis, Compass verteilen zu können. Ich habe angefangen, innerhalb von Compass daran zu arbeiten, indem ich Datengrid-Lösungen wie GigaSpaces, Coherence und Terracotta integriert habe, aber das reicht nicht aus.

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

Aus diesem Grund habe ich ElasticSearch erstellt. Es hat ein sehr fortschrittliches verteiltes Modell, spricht JSON nativ und bietet viele erweiterte Suchfunktionen, die alle nahtlos über JSON DSL zum Ausdruck kommen.

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

Was Sphinx betrifft, habe ich es nicht benutzt, daher kann ich keinen Kommentar abgeben. Worauf ich Sie verweisen kann, ist dieser Thread im Sphinx-Forum was meines Erachtens das überlegene verteilte Modell von ElasticSearch beweist.

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

779
kimchy

Ich habe Sphinx, Solr und Elasticsearch verwendet. Solr/Elasticsearch basieren auf Lucene. Es werden viele gängige Funktionen hinzugefügt: Webserver-API, Facettierung, Zwischenspeicherung 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 Beispielverwendungen:

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github
64
tommy chheng

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 Lucene erfordert die Programmierung in Java.

Wenn Sie von vorne anfangen, ist das Tool für Sie in der Lucene-Familie Solr , das viel einfacher einzurichten ist als nacktes Lucene und fast die gesamte Leistung von Lucene besitzt. Es kann Datenbankdokumente leicht importieren. Solr ist in Java geschrieben, daher erfordert jede Änderung von Solr Java Kenntnisse, aber Sie können eine Menge 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 solltest du wählen nach:

  • Die erforderliche Funktionalität - z.B. Benötigen Sie einen französischen Stemmer? Lucene und Solr haben eine, die anderen kenne ich nicht.
  • Kenntnisse in der Implementierungssprache - Berühren Sie nicht Java Lucene, wenn Sie Java nicht kennen. Möglicherweise benötigen Sie C++, um mit Sphinx zu arbeiten. Lucene wurde auch in other portiert = languages . 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 zu anderer Software - Sphinx verfügt über 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.
62
Yuval F

Wir verwenden Sphinx in einem vertikalen Suchprojekt mit über 10.000.000 MySQL-Einträgen und über 10 verschiedenen Datenbanken. Es hat eine sehr gute 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.

20
Emiliano M.
18
Karussell

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 (1 KB 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 (1 KB gleichzeitig):

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

Der einzige Vergleich zwischen Elasticsearch und Solr-Leistung, den ich bisher finden konnte, ist hier:

Solr vs elasticsearch Deathmatch!

8
Gene

Lucene ist nett und alle, aber ihre Stop-Word-Set ist schrecklich. Ich musste StopAnalyzer.ENGLISH_STOP_WORDS_SET manuell eine Tonne Stoppwörter hinzufügen, nur um es in die Nähe der Verwendbarkeit zu bringen.

Ich habe Sphinx nicht benutzt, aber ich weiß, dass die Leute auf seine Schnelligkeit und sein nahezu magisches Verhältnis von "Einrichtbarkeit zu Attraktivität" schwören.

7
larley

Versuchen Sie es mit indextank.

Im Falle der elastischen Suche wurde es als viel einfacher zu verwenden als Lucene/Solr gedacht. Es enthält auch ein sehr flexibles Bewertungssystem, das ohne erneute Indizierung optimiert werden kann.

7
Spike