Vergleich der Volltextsuchmaschine - Lucene, Sphinx, Postgresql, MySQL?

312

Ich baue eine Django-Site auf und suche eine Suchmaschine.

Einige Kandidaten:

  • Lucene / Lucene mit Kompass / Solr

  • Sphinx

  • Integrierte Postgresql-Volltextsuche

  • In MySQl integrierte Volltextsuche

Auswahlkriterium:

  • Ergebnisrelevanz und Ranking
  • Such- und Indizierungsgeschwindigkeit
  • Benutzerfreundlichkeit und einfache Integration in Django
  • Ressourcenanforderungen - Die Site wird auf einem VPS gehostet , sodass die Suchmaschine im Idealfall nicht viel RAM und CPU benötigt
  • Skalierbarkeit
  • zusätzliche Funktionen wie "Meinten Sie?", verwandte Suchanfragen usw.

Jeder, der Erfahrung mit den oben genannten Suchmaschinen oder anderen nicht in der Liste aufgeführten Suchmaschinen hat - ich würde gerne Ihre Meinung hören.

BEARBEITEN: Wenn Benutzer weiterhin Daten in die Site eingeben, müssen diese Daten kontinuierlich indiziert werden. Es muss nicht in Echtzeit sein, aber im Idealfall werden neue Daten mit einer Verzögerung von nicht mehr als 15 bis 30 Minuten im Index angezeigt

Fortsetzung
quelle
26
2 ¢: MySQL-Volltextsuche und Transaktionen schließen sich (derzeit) gegenseitig aus. MySQL-Volltextindizes erfordern den Tabellentyp MyISAM, der keine Transaktionen unterstützt. (Im Gegensatz zum InnoDB-Tabellentyp, der Transaktionen unterstützt, jedoch keine Volltextindizes.)
Carl G
2
Die PostgreSQL-Volltextsuche Tsearch unterstützt keine Phrasensuche. Es befindet sich jedoch auf der TODO-Liste sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam
1
Wer dies für Django sucht, sollte sich die Heuhaufen-App ansehen. haystacksearch.org
Keyo
24
@ CarlG, nur als Referenz für alle. MySQL 5.6+ hat Volltextsuche Unterstützung mit innodb Engine
DhruvPathak

Antworten:

167

Gut zu sehen, dass sich jemand für Lucene engagiert - weil ich keine Ahnung davon habe.

Sphinx hingegen weiß ich ganz genau, also mal sehen, ob ich Ihnen helfen kann.

  • Das Ranking der Ergebnisrelevanz ist die Standardeinstellung. Sie können Ihre eigene Sortierung einrichten, wenn Sie dies wünschen, und bestimmten Feldern höhere Gewichtungen geben.
  • Die Indizierungsgeschwindigkeit ist superschnell, da sie direkt mit der Datenbank kommuniziert. Jede Langsamkeit wird durch komplexe SQL-Abfragen und nicht indizierte Fremdschlüssel und andere derartige Probleme verursacht. Ich habe auch nie eine Langsamkeit bei der Suche bemerkt.
  • Ich bin ein Rails-Typ, daher habe ich keine Ahnung, wie einfach es ist, mit Django zu implementieren. Es gibt jedoch eine Python-API, die mit der Sphinx-Quelle geliefert wird.
  • Der Suchdienst-Daemon (searchd) hat eine relativ geringe Speichernutzung - und Sie können festlegen, wie viel Speicher der Indexerprozess ebenfalls verwendet.
  • Bei der Skalierbarkeit ist mein Wissen eher lückenhaft - aber es ist einfach genug, Indexdateien auf mehrere Computer zu kopieren und mehrere Suchdämonen auszuführen. Der allgemeine Eindruck, den ich von anderen bekomme, ist, dass es unter hoher Last verdammt gut ist, so dass es nicht erforderlich ist, es auf mehrere Maschinen zu skalieren.
  • Es gibt keine Unterstützung für "Did-you-Mean" usw. - obwohl dies mit anderen Tools leicht genug möglich ist. Sphinx verwendet Wörter mithilfe von Wörterbüchern, sodass "Fahren" und "Fahren" (zum Beispiel) bei Suchvorgängen als gleich angesehen werden.
  • Sphinx erlaubt jedoch keine teilweisen Indexaktualisierungen für Felddaten. Der übliche Ansatz besteht darin, einen Delta-Index mit allen jüngsten Änderungen beizubehalten und diesen nach jeder Änderung neu zu indizieren (und diese neuen Ergebnisse erscheinen innerhalb von ein oder zwei Sekunden). Aufgrund der geringen Datenmenge kann dies einige Sekunden dauern. Sie müssen den Hauptdatensatz jedoch weiterhin regelmäßig neu indizieren (obwohl die Häufigkeit von der Volatilität Ihrer Daten abhängt - jeden Tag? Jede Stunde?). Die schnellen Indizierungsgeschwindigkeiten machen dies alles ziemlich schmerzlos.

Ich habe keine Ahnung, wie zutreffend dies für Ihre Situation ist, aber Evan Weaver hat einige der gängigen Rails-Suchoptionen (Sphinx, Ferret (ein Port von Lucene für Ruby) und Solr) verglichen und einige Benchmarks ausgeführt. Könnte nützlich sein, denke ich.

Ich habe die Tiefen der Volltextsuche von MySQL nicht untersucht, aber ich weiß, dass sie weder in Bezug auf die Geschwindigkeit noch in Bezug auf die Funktionen mit Sphinx, Lucene oder Solr konkurriert.

klopfen
quelle
Mit Sphinx können Sie einzelne Attribute von Elementen in aktuellen Indizes aktualisieren, jedoch keine vollständigen Datensätze entfernen / aktualisieren.
Xorlev
Mit sphinx RT können Sie teilweise Aktualisierungen / Entfernungen durchführen. es ist in einem frühen Stadium, aber es funktioniert bereits [fast]. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd
4
Hier ist eine Antwort auf Solr , die ein gutes Paar zu dieser Antwort auf Sphinx
New Alexandria
In Bezug auf die Geschwindigkeit kann nichts mit Sphinx mithalten. Wenn also Geschwindigkeit Ihr Hauptanliegen ist, ist Sphinx die richtige Wahl. Netter Beitrag
Twigg
Sphinx 2.3.2 Beta hat jetzt eine Funktion namens "CALL SUGGEST", mit der Sie "Meinten Sie?" Implementieren können. sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K
82

Ich kenne Sphinx nicht, aber was Lucene im Vergleich zu einer Datenbank-Volltextsuche betrifft, denke ich, dass die Leistung von Lucene unübertroffen ist. Sie sollten in der Lage sein, fast jede Suche in weniger als 10 ms durchzuführen, unabhängig davon, wie viele Datensätze Sie durchsuchen müssen, vorausgesetzt, Sie haben Ihren Lucene-Index korrekt eingerichtet.

Hier kommt jedoch die größte Hürde: Ich persönlich denke, dass es nicht einfach ist, Lucene in Ihr Projekt zu integrieren . Sicher, es ist nicht allzu schwierig, es einzurichten, damit Sie eine einfache Suche durchführen können. Wenn Sie jedoch das Beste aus ihm herausholen und eine optimale Leistung erzielen möchten, benötigen Sie auf jeden Fall ein gutes Buch über Lucene.

Was die CPU- und RAM-Anforderungen betrifft, so führt die Suche in Lucene Ihre CPU nicht zu sehr aus, obwohl die Indizierung Ihrer Daten erforderlich ist, obwohl Sie dies nicht zu oft tun (möglicherweise ein- oder zweimal am Tag) eine große Hürde.

Es beantwortet nicht alle Ihre Fragen, aber kurz gesagt, wenn Sie viele Daten suchen müssen und eine hervorragende Leistung wünschen, ist Lucene meiner Meinung nach definitiv der richtige Weg. Wenn Sie nicht so viele Daten durchsuchen müssen, können Sie auch eine Datenbank-Volltextsuche durchführen. Das Einrichten einer MySQL-Volltextsuche ist in meinem Buch definitiv einfacher.

Razzie
quelle
10
Im Vergleich zur Sphinx ist die Klarheit zu langsam und sperrig. Ich hatte beide in meinem Projekt verwendet und blieb schließlich bei der Sphinx. Lucence ist in Java und benötigt viel mehr CPU und RAM als Sphinx.
Phyo Arkar Lwin
25
Ich muss hier nicht zustimmen. Lucene ist blitzschnell, wenn Sie einen korrekten Index erstellen. Grundsätzlich können Sie eine erweiterte Abfrage über Millionen von Datensätzen in nur wenigen Millisekunden durchführen. Sie müssen nur wissen, was Sie tun. Und Lucene ist in Java ... dein Punkt ist? Es gibt auch einen .NET-Port, übrigens Lucene.NET.
Razzie
15
Sie haben jedoch klar angegeben, dass Sie keine Sphinx verwenden, und v3sson hat beide verwendet.
user508546
20
Wie können Sie feststellen, dass die Leistung von Lucene in demselben Satz, in dem Sie angeben, dass Sie keine Sphinx verwendet haben, unerreicht ist?
user508546
22
Gültige Fragen. Ich habe nie gesagt, dass Lucene schneller als Sphinx ist. Ich habe erwähnt, dass Lucene im Vergleich zu einer Datenbank-Volltextsuche unerreicht ist. Und es ist. Keine Frage. Lucene basiert auf einem invertierten Index. Jetzt kenne ich Sphinx nicht, wie bereits erwähnt, aber wenn es auch einen invertierten Index oder eine ähnliche Indexierungsmethode verwendet, ist es möglich, dass sie die gleiche Leistung erbringen. Die Aussage, dass Lucene im Vergleich zu Sphinx "zu langsam und sperrig" wäre, basiert nicht auf Fakten. Vor allem nicht, wenn nur gesagt wird, dass Lucene in 'Java' ist, was in Bezug auf die Leistung nur ein lächerliches Problem darstellt.
Razzie
60

Ich bin überrascht, dass es keine weiteren Informationen über Solr gibt. Solr ist Sphinx ziemlich ähnlich, verfügt jedoch über erweiterte Funktionen (AFAIK, da ich Sphinx nicht verwendet habe - lesen Sie nur darüber).

Die Antwort unter dem folgenden Link beschreibt einige Dinge über Sphinx, die auch für Solr gelten. Vergleich der Volltextsuchmaschine - Lucene, Sphinx, Postgresql, MySQL?

Solr bietet außerdem die folgenden zusätzlichen Funktionen:

  1. Unterstützt die Replikation
  2. Mehrere Kerne (stellen Sie sich diese als separate Datenbanken mit eigener Konfiguration und eigenen Indizes vor)
  3. Boolesche Suche
  4. Hervorheben von Schlüsselwörtern (relativ einfach im Anwendungscode, wenn Sie Regex-Fu haben; lassen Sie sich jedoch von einem speziellen Tool einen besseren Job machen)
  5. Aktualisieren Sie den Index über XML oder eine begrenzte Datei
  6. Kommunizieren Sie mit dem Suchserver über HTTP (es kann sogar Json, Native PHP / Ruby / Python zurückgeben).
  7. PDF, Indizierung von Word-Dokumenten
  8. Dynamische Felder
  9. Facetten
  10. Aggregierte Felder
  11. Stoppt Wörter, Synonyme usw.
  12. Mehr wie das...
  13. Indizieren Sie direkt aus der Datenbank mit benutzerdefinierten Abfragen
  14. Automatisch vorschlagen
  15. Cache Autowarming
  16. Schnelle Indizierung (im Vergleich zu den Indizierungszeiten für die MySQL-Volltextsuche) - Lucene verwendet ein binäres invertiertes Indexformat.
  17. Boosting (benutzerdefinierte Regeln zur Erhöhung der Relevanz eines bestimmten Schlüsselworts oder einer bestimmten Phrase usw.)
  18. Feldsuchen (wenn ein Suchbenutzer das Feld kennt, das er / sie durchsuchen möchte, schränkt er seine Suche ein, indem er das Feld und dann den Wert eingibt, und NUR dieses Feld wird durchsucht, anstatt alles - viel bessere Benutzererfahrung)

Übrigens gibt es Tonnen mehr Funktionen; Ich habe jedoch nur die Funktionen aufgelistet, die ich tatsächlich in der Produktion verwendet habe. Übrigens unterstützt MySQL sofort # 1, # 3 und # 11 (eingeschränkt) in der obigen Liste. Für die Funktionen, die Sie suchen, wird eine relationale Datenbank sie nicht schneiden. Ich würde diese sofort beseitigen.

Ein weiterer Vorteil ist, dass Solr (eigentlich Lucene) eine Dokumentendatenbank (z. B. NoSQL) ist, sodass viele der Vorteile einer anderen Dokumentendatenbank mit Solr realisiert werden können. Mit anderen Worten, Sie können es nicht nur für die Suche (dh für die Leistung) verwenden. Werden Sie kreativ damit :)

Wil Moore III
quelle
Sphinx auch über Unterstützt die Replikation Mehrere Kerne Boolesche Suche Hervorhebung von Schlüsselwörtern Index über XML aktualisieren - oder durch begrenzte Dateien - PDF, Indexierung von Word-Dokumenten (über XML) Facetten Stoppwörter, Synonyme usw. Indizieren Sie direkt aus der Datenbank mit benutzerdefinierten Abfragen Indizierung Boosting Fielded Search Über dynamische Felder Aggregierte Felder Cache Autowarming Ich weiß es einfach nicht
Moosh
58

Apache Solr


Lassen Sie mich neben der Beantwortung der Fragen von OP einige Einblicke in Apache Solr geben, von der einfachen Einführung bis zur detaillierten Installation und Implementierung .

Einfache Einführung


Jeder, der Erfahrung mit den oben genannten Suchmaschinen oder anderen nicht in der Liste aufgeführten Suchmaschinen hat - ich würde gerne Ihre Meinung hören.

Solr sollte nicht zur Lösung von Echtzeitproblemen verwendet werden. Für Suchmaschinen ist Solr so ziemlich ein Spiel und funktioniert einwandfrei .

Solr funktioniert gut mit Webanwendungen mit hohem Datenverkehr ( ich habe irgendwo gelesen, dass es dafür nicht geeignet ist, aber ich unterstütze diese Aussage ). Es nutzt den RAM, nicht die CPU.

  • Ergebnisrelevanz und Ranking

Der Boost hilft Ihnen dabei, Ihre Ergebnisse ganz oben zu platzieren. Sprich : Sie versuchen , einen Namen zu suchen john in den Feldern Vorname und Nachname , und Sie wollen Relevanz der geben Vorname Feld, dann müssen Sie steigern die oben Vorname Feld wie gezeigt.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Wie Sie sehen können, wird das Feld für den Vornamen mit einer Punktzahl von 2 erhöht .

Mehr zu SolrRelevancy

  • Such- und Indizierungsgeschwindigkeit

Die Geschwindigkeit ist unglaublich hoch und keine Kompromisse. Der Grund, warum ich nach Solr gezogen bin .

In Bezug auf die Indizierungsgeschwindigkeit kann Solr auch JOINS aus Ihren Datenbanktabellen verarbeiten. Ein höherer und komplexer JOIN wirkt sich auf die Indizierungsgeschwindigkeit aus. Eine enorme RAM- Konfiguration kann diese Situation jedoch problemlos bewältigen.

Je höher der RAM, desto schneller ist die Indizierungsgeschwindigkeit von Solr.

  • Benutzerfreundlichkeit und einfache Integration in Django

Ich habe nie versucht, Solr und Django zu integrieren , aber Sie können dies mit Haystack erreichen . Ich habe einen interessanten Artikel darüber gefunden und hier ist der Github dafür.

  • Ressourcenanforderungen - Die Site wird auf einem VPS gehostet, sodass die Suchmaschine im Idealfall nicht viel RAM und CPU benötigt

Solr züchtet auf RAM. Wenn der RAM also hoch ist, müssen Sie sich keine Sorgen um Solr machen .

Solrs RAM-Auslastung steigt bei vollständiger Indizierung. Wenn Sie über einige Milliarden Datensätze verfügen, können Sie Delta-Importe intelligent einsetzen, um diese Situation zu bewältigen. Wie bereits erläutert, ist Solr nur eine Echtzeitlösung .

  • Skalierbarkeit

Solr ist hoch skalierbar. Schauen Sie sich SolrCloud an . Einige Hauptmerkmale davon.

  • Shards (oder Sharding ist das Konzept, den Index auf mehrere Computer zu verteilen, z. B. wenn Ihr Index zu groß geworden ist)
  • Lastausgleich (Wenn Solrj mit der Solr-Cloud verwendet wird, wird der Lastausgleich mithilfe des Round-Robin-Mechanismus automatisch durchgeführt.)
  • Verteilte Suche
  • Hohe Verfügbarkeit
  • zusätzliche Funktionen wie "Meinten Sie?", verwandte Suchanfragen usw.

Für das obige Szenario können Sie die SpellCheckComponent verwenden , die mit Solr gepackt ist . Es gibt viele andere Funktionen, die SnowballPorterFilterFactory hilft Datensätze abzurufen sagen , wenn Sie eingegeben haben , Bücher statt Buch , werden Sie mit den Ergebnissen im Zusammenhang präsentiert Buch .


Diese Antwort konzentriert sich weitgehend auf Apache Solr & MySQL . Django ist außer Reichweite.

Angenommen, Sie befinden sich in einer LINUX-Umgebung, können Sie mit diesem Artikel fortfahren. (meins war eine Ubuntu 14.04 Version)

Detaillierte Installation

Loslegen

Laden Sie Apache Solr von hier . Das wäre Version 4.8.1 . Sie könnten neue Versionen herunterladen, ich fand diesen Stall.

Extrahieren Sie das Archiv nach dem Herunterladen in einen Ordner Ihrer Wahl. Sag .. Downloadsoder was auch immer .. Also wird es so aussehenDownloads/solr-4.8.1/

Auf Ihre Aufforderung hin. Navigieren Sie in das Verzeichnis

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Also jetzt bist du hier ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Starten Sie den Jetty Application Server

Jetty ist im Beispielordner des solr-4.8.1Verzeichnisses verfügbar. Navigieren Sie also darin und starten Sie den Jetty Application Server.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Schließen Sie das Terminal jetzt nicht, minimieren Sie es und lassen Sie es beiseite.

(TIPP: Verwenden Sie & after start.jar, um den Jetty Server im Hintergrund auszuführen.)

Um zu überprüfen, ob Apache Solr erfolgreich ausgeführt wird, besuchen Sie diese URL im Browser. http: // localhost: 8983 / solr

Jetty auf einem benutzerdefinierten Port ausführen

Es wird standardmäßig auf dem Port 8983 ausgeführt. Sie können den Port entweder hier oder direkt in der jetty.xmlDatei ändern .

java -Djetty.port=9091 -jar start.jar

Laden Sie den JConnector herunter

Diese JAR - Datei dient als Brücke zwischen MySQL und JDBC, Laden Sie die Platform Independent Version hier

Extrahieren mysql-connector-java-5.1.31-bin.jarSie nach dem Herunterladen den Ordner, kopieren Sie den Ordner und fügen Sie ihn in das lib- Verzeichnis ein.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Erstellen der MySQL-Tabelle, die mit Apache Solr verknüpft werden soll

Um Solr verwenden zu können, müssen Sie nach Tabellen und Daten suchen. Dafür werden wir MySQL verwenden, um eine Tabelle zu erstellen und einige zufällige Namen zu pushen , und dann könnten wir Solr verwenden , um eine Verbindung zu MySQL herzustellen und diese Tabelle und ihre Einträge zu indizieren.

1.Tabellenstruktur

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. Füllen Sie die obige Tabelle aus

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

In den Kern eindringen und die lib-Direktiven hinzufügen

1.Navigieren zu

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2. Ändern der Datei solrconfig.xml

Fügen Sie diese beiden Anweisungen zu dieser Datei hinzu.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Fügen Sie nun den DIH (Data Import Handler) hinzu.

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Erstellen Sie die Datei db-data-config.xml

Wenn die Datei vorhanden ist, ignorieren Sie sie und fügen Sie diese Zeilen zu dieser Datei hinzu. Wie Sie in der ersten Zeile sehen können, müssen Sie die Anmeldeinformationen Ihrer MySQL- Datenbank angeben . Der Datenbankname, der Benutzername und das Passwort.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(TIPP: Sie können eine beliebige Anzahl von Entitäten haben, aber achten Sie auf das ID-Feld. Wenn diese identisch sind, wird die Indizierung übersprungen.)

4. Ändern Sie die Datei schema.xml

Fügen Sie dies wie gezeigt zu Ihrer schema.xml hinzu .

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Implementierung

Indizierung

Hier ist das eigentliche Geschäft. Sie müssen die Indizierung von Daten von MySQL nach Solr durchführen, um Solr-Abfragen verwenden zu können.

Schritt 1: Gehen Sie zum Solr Admin Panel

Klicken Sie in Ihrem Browser auf die URL http: // localhost: 8983 / solr . Der Bildschirm öffnet sich so.

Dies ist das Hauptverwaltungsfenster von Apache Solr

Gehen , wie die Markierung zeigt an , zu Protokollierung inorder zu überprüfen , ob eine der oben genannten Konfiguration zu Fehlern geführt hat.

Schritt 2: Überprüfen Sie Ihre Protokolle

Ok, jetzt bist du hier. Wie du kannst, gibt es viele gelbe Meldungen (WARNHINWEISE). Stellen Sie sicher, dass keine rot markierten Fehlermeldungen vorliegen. Zuvor hatten wir in unserer Konfiguration eine Auswahlabfrage in unserer Datei db-data-config.xml hinzugefügt . Wenn bei dieser Abfrage Fehler aufgetreten wären, wäre diese hier angezeigt worden.

Dies ist der Protokollierungsabschnitt Ihrer Apache Solr-Engine

Gut, keine Fehler. Wir sind gut zu gehen. Wählen Sie wie abgebildet Sammlung1 aus der Liste aus und wählen Sie Datenimport

Schritt 3: DIH (Data Import Handler)

Mit dem DIH stellen Sie von Solr über die Konfigurationsdatei db-data-config.xml über die Solr- Schnittstelle eine Verbindung zu MySQL her und rufen die 10 Datensätze aus der Datenbank ab, die auf Solr indiziert wird .

Um dies zu tun, wählen Sie Voll Import , und überprüfen Sie die Optionen reinigen und Commit . Klicken Sie nun wie gezeigt auf Ausführen .

Alternativ können Sie auch direkt verwenden Voll Import Abfrage wie folgt zu ..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

Der Datenimport-Handler

Nachdem Sie auf Ausführen geklickt haben , beginnt Solr mit der Indizierung der Datensätze. Wenn Fehler aufgetreten sind , wird angezeigt , dass die Indizierung fehlgeschlagen ist, und Sie müssen zum Abschnitt Protokollierung zurückkehren, um festzustellen , was schief gelaufen ist.

Angenommen, bei dieser Konfiguration liegen keine Fehler vor, und wenn die Indizierung erfolgreich abgeschlossen wurde, erhalten Sie diese Benachrichtigung.

Indizierungserfolg

Schritt 4: Ausführen von Solr-Abfragen

Anscheinend ist alles gut gelaufen. Jetzt können Sie Solr Queries verwenden, um die indizierten Daten abzufragen. Klicken Sie links auf die Abfrage und dann unten auf die Schaltfläche Ausführen .

Sie sehen die indizierten Datensätze wie gezeigt.

Die entsprechende Solr- Abfrage zum Auflisten aller Datensätze lautet

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

Die indizierten Daten

Nun, es gibt alle 10 indizierten Datensätze. Angenommen, wir benötigen nur Namen, die mit Ja beginnen . In diesem Fall müssen Sie den Spaltennamen als Ziel festlegen solr_name. Daher lautet Ihre Abfrage wie folgt.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Die JSON-Daten beginnen mit Ja *

So schreiben Sie Solr- Abfragen. Um mehr darüber zu lesen, lesen Sie diesen schönen Artikel .

Shankar Damodaran
quelle
3
@Downvoter, zögern Sie nicht, diese Antwort zu kommentieren oder zu bearbeiten, und die Begründung für die Ablehnung wird auch anderen helfen.
Shankar Damodaran
4
Dies ist einer der umfassendsten und am besten organisierten Beiträge, die ich auf SO gesehen habe. Beeindruckende Arbeit.
entartet
28

Ich beschäftige mich gerade mit der PostgreSQL-Volltextsuche und sie verfügt über die richtigen Funktionen einer modernen Suchmaschine, einen wirklich guten erweiterten Charakter und mehrsprachige Unterstützung sowie eine schöne enge Integration mit Textfeldern in der Datenbank.

Aber es gibt keine benutzerfreundlichen Suchoperatoren wie + oder AND (verwendet & |!) Und ich bin nicht begeistert davon, wie es auf ihrer Dokumentationsseite funktioniert. Während die Ergebnisausschnitte fettgedruckt sind, ist der Standardalgorithmus, für den Übereinstimmungsbegriffe nicht geeignet sind. Wenn Sie RTF, PDF, MS Office indizieren möchten, müssen Sie einen Dateiformatkonverter finden und integrieren.

OTOH, es ist viel besser als die MySQL-Textsuche, bei der nicht einmal Wörter mit drei oder weniger Buchstaben indiziert werden. Dies ist die Standardeinstellung für die MediaWiki-Suche, und ich denke wirklich, dass sie für Endbenutzer nicht gut ist: http://www.searchtools.com/analysis/mediawiki-search/

In allen Fällen, die ich gesehen habe, sind Lucene / Solr und Sphinx wirklich großartig . Sie sind solider Code und haben sich mit erheblichen Verbesserungen in der Benutzerfreundlichkeit weiterentwickelt. Daher sind alle Tools vorhanden, um eine Suche durchzuführen, die fast alle zufriedenstellt.

für SHAILI - SOLR enthält die Lucene-Suchcodebibliothek und verfügt über die Komponenten, um eine nette eigenständige Suchmaschine zu sein.

SearchTools-Avi
quelle
1
Ich glaube, dass Sie sich auf die PostgreSQL-Volltextsuche beziehen Tsearch. Tsearch unterstützt jedoch keine Phrasensuche. Es ist immer noch auf ihrer TODO-Liste sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam
1
Ich habe gerade einige Tests mit der Volltextsuche nach Postgres 9.0 durchgeführt. war enttäuscht, dass der französische Text nicht übereinstimmt, wenn der Benutzer vergisst, alle Akzente richtig zu setzen. Die Übereinstimmung von Wortformen ist lückenhaft - beispielsweise stimmt "say" im Englischen nicht mit Text überein, der "say" enthält. Insgesamt jedoch ziemlich beeindruckend für eine integrierte Funktion in allen getesteten Sprachen (en, fr, ru).
Roman Starkov
9
@romkyns: Sie müssen ein Wörterbuch ohne Akzent installieren, um sie zu entfernen.
Denis de Bernardy
2
"OTOH, es ist viel besser als die MySQL-Textsuche, bei der nicht einmal Wörter mit drei oder weniger Buchstaben indiziert werden." Dies ist keine integrierte Einschränkung von MySQL - es ist alles, was Sie in der Konfigurationsdatei festgelegt haben. Wenn Sie Wörter mit einem Buchstaben indizieren möchten, ändern Sie einfach einen Wert in der Konfiguration.
Canuck
1
Es ist besorgniserregend, dass Leute Vergleiche mit Datenbanken anstellen, die sie noch nicht vollständig erforscht haben. MySQL KANN Wörter mit maximal drei Zeichen indizieren - Sie müssen sie nur richtig konfigurieren.
TheCarver
22

Nur meine zwei Cent für diese sehr alte Frage. Ich kann ElasticSearch nur empfehlen .

Elasticsearch ist ein Suchserver, der auf Lucene basiert. Es bietet eine verteilte, mandantenfähige Volltextsuchmaschine mit einer RESTful-Weboberfläche und schemafreien JSON-Dokumenten. Elasticsearch wurde in Java entwickelt und unter den Bedingungen der Apache-Lizenz als Open Source veröffentlicht.

Die Vorteile gegenüber anderen FTS-Motoren (Volltextsuche) sind:

  • RESTful-Schnittstelle
  • Bessere Skalierbarkeit
  • Große Gemeinschaft
  • Erbaut von Lucene-Entwicklern
  • Umfangreiche Dokumentation
  • Es gibt viele Open Source-Bibliotheken (einschließlich Django)

Wir verwenden diese Suchmaschine in unserem Projekt und sind sehr zufrieden damit.

vooD
quelle
10

SearchTools-Avi sagte: "MySQL-Textsuche, bei der nicht einmal Wörter mit drei oder weniger Buchstaben indiziert werden."

Zu Ihrer Information: Die minimale Wortlänge von MySQL-Volltext ist seit mindestens MySQL 5.0 einstellbar . Google 'MySQL Volltext min Länge' für einfache Anweisungen.

Das heißt, MySQL-Volltext hat Einschränkungen: Zum einen wird die Aktualisierung langsam, sobald Sie eine Million Datensätze oder so erreichen, ...

BJ.
quelle
2

Ich würde mnoGoSearch zur Liste hinzufügen . Extrem leistungsfähige und flexible Lösung, die als Google funktioniert: Der Indexer ruft Daten von mehreren Websites ab. Sie können grundlegende Kriterien verwenden oder Ihre eigenen Hooks erfinden, um maximale Suchqualität zu erzielen. Es könnte auch die Daten direkt aus der Datenbank abrufen.

Die Lösung ist heute nicht so bekannt, erfüllt aber die maximalen Anforderungen. Sie können es kompilieren und installieren oder auf einem eigenständigen Server oder sogar auf Ihrem Hauptserver. Es benötigt nicht so viele Ressourcen wie Solr, da es in C geschrieben ist und auch auf kleinen Servern perfekt läuft.

Am Anfang müssen Sie es selbst kompilieren, daher sind einige Kenntnisse erforderlich. Ich habe ein kleines Skript für Debian erstellt, das helfen könnte. Anpassungen sind willkommen.

Da Sie das Django-Framework verwenden, können Sie einen PHP-Client in der Mitte verwenden oder eine Lösung in Python finden. Ich habe einige Artikel gesehen .

Und natürlich ist mnoGoSearch Open Source, GNU GPL.

Fedir RYKHTIK
quelle