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?
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?
Antworten:
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.
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:
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:
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.
Ein Experiment zum Vergleich von ElasticSearch und Solr
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)
Der einzige Leistungsvergleich zwischen Elasticsearch und Solr, den ich bisher finden konnte, ist hier:
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.
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.