2008-08-31 10 views
58

Hat jemand Lucene.NET verwendet, anstatt die Volltextsuche zu verwenden, die mit SQL Server geliefert wird?Konfigurieren von Lucene.Net mit SQL Server

Wenn ja, würde mich interessieren, wie Sie es implementiert haben.

Haben Sie zum Beispiel einen Windows-Dienst geschrieben, der die Datenbank stündlich abgefragt und dann die Ergebnisse im lucene.net-Index gespeichert hat?

Antwort

57

Ja, ich habe es genau für das verwendet, was Sie beschreiben. Wir hatten zwei Dienste - einen zum Lesen und einen zum Schreiben, aber nur, weil wir mehrere Leser hatten. Ich bin mir sicher, dass wir es mit nur einem Service (dem Autor) hätten machen können und den Reader in die Web-App und Services eingebettet hätten.

Ich habe lucene.net als allgemeine Datenbank-Indexer verwendet, also was ich zurückbekommen habe, war im Grunde Datenbank-IDs (für indizierte E-Mail-Nachrichten), und ich benutze es auch, um genügend Informationen zu erhalten, um Suchergebnisse zu füllen oder so ohne die Datenbank zu berühren. Es hat in beiden Fällen gut funktioniert, das SQL kann etwas langsam werden, da man ziemlich genau eine ID bekommen muss, eine ID auswählen muss usw. Wir haben es geschafft, indem wir eine temporäre Tabelle (mit nur der ID-Zeile) erstellt haben Masseneinfügung von einer Datei (die die Ausgabe von Lucene war), dann Verbinden mit der Nachrichtentabelle. War viel schneller.

Lucene ist nicht perfekt, und Sie müssen ein wenig außerhalb der relationalen Datenbank Box denken, weil es TOTAL ist nicht eins, aber es ist sehr, sehr gut, was es tut. Einen Blick wert, und, ich habe gesagt, hat nicht die "oops, sorry, müssen Sie Ihren Index neu aufbauen" Probleme, die MS SQL FTI tut.

BTW, hatten wir mit 20-50Millionen E-Mails (und rund 1 Million einzigartige Anhänge), insgesamt etwa 20 GB Lucene Index denke ich, und 250 + GB SQL-Datenbank + Anhänge.

Die Leistung war fantastisch, gelinde gesagt - stellen Sie sicher, dass Sie über Ihre Merge-Faktoren nachdenken und sie optimieren (wenn Indexsegmente zusammengeführt werden). Es gibt kein Problem mit mehr als einem Segment, aber es kann ein GROßES Problem geben, wenn Sie versuchen, zwei Segmente zusammenzuführen, die jeweils 1mil Elemente enthalten, und Sie haben einen Watcher-Thread, der den Prozess beendet, wenn es zu lange dauert ... .. (ja, das hat uns für eine Weile in den Arsch getreten). So behalten Sie die maximale Anzahl der Dokumente pro Thinggie LOW (dh nicht auf maxint wie wir es getan!)

Bearbeiten Corey Trager dokumentiert, wie Lucene.NET in BugTracker.NET here zu verwenden.

+1

Ich habe auch die Simple Savant-Bibliothek für Amazon SimpleDB mit Lucene.NET mit Volltextindizierung unterstützt. Die Architektur wird hier beschrieben: http://simplesavant.codeplex.com/wikipage?title=Full-Text%20Indexing&referringTitle=Documentation –

2

ich es nicht gegen Datenbank noch nicht getan haben, Ihre Frage ein bisschen geöffnet ist.

Wenn Sie eine db durchsuchen möchten und Lucene verwenden können, schätze ich auch, dass Sie steuern können, wann Daten in die Datenbank eingefügt werden. Wenn dies der Fall ist, gibt es wenig Grund, die db abzufragen, um herauszufinden, ob Sie neu indizieren müssen, nur beim Einfügen indexieren oder eine Queue-Tabelle erstellen, die verwendet werden kann, um Lucene mitzuteilen, was zu indizieren ist.

Ich denke, wir brauchen keinen anderen Indexer, der nicht weiß, was er tut und immer wieder neu indiziert oder Ressourcen verschwendet.

1

Ich habe Lucene.NET zusammen mit MySQL verwendet. Meine Vorgehensweise bestand darin, den Primärschlüssel des db-Datensatzes im Lucene-Dokument zusammen mit indiziertem Text zu speichern.In Pseudo-Code sieht es so aus:

  • Shop Rekord:

    Text einfügen, andere Daten auf den Tisch
    erhalten neueste eingesetzte ID
    lucene Dokument
    put (ID, Text) in lucene erstellen Dokument Update lucene Index

  • Abfrage
    Suche Lucene Index
    für jeden lucene doc in Ergebnismenge Lastdaten von DB durch gespeicherte Datensatz des ID

Just, die ich von Lucene zu Sphinx geschaltet zu beachten, aufgrund seiner hervorragenden Leistung

+0

Aku, mit dieser Implementierung, wie verwalten Sie Updates für die Daten? Löschen und erstellen Sie eine Datei für den Lucene-Index neu? Planen Sie den Re-Index oder ist es in Echtzeit? Ich stelle diese Fragen in der Hoffnung, besser zu verstehen, ob ich es benutzen soll oder nicht. Danke, Totenkopf. – deadbug

+0

@deadbug, mein System war lesenintensiv, löschte altes Lucene-Dokument und fügte neues hinzu. Ich experimentierte mit der Planung, entschied mich aber dafür, das System einfach zu halten. Bei diesem Ansatz gab es keine Leistungsprobleme. – aku

2

I lucene.net verwendet wurden auch als Speicher-Engine, da es einfacher ist, alternative Maschinen mit einem Index als einer Datenbank zu verteilen und einzurichten, es ist nur eine Dateisystemkopie, Sie können auf einem Computer indizieren und die neuen Dateien einfach auf die anderen Computer kopieren, um den Index zu verteilen. Alle Suchen und Details werden aus dem Lucene-Index angezeigt, und die Datenbank wird nur zur Bearbeitung verwendet. Diese Konfiguration hat sich als sehr skalierbare Lösung für unsere Bedürfnisse erwiesen.

In Bezug auf die Unterschiede zwischen Sql-Server und Lucene, das Hauptproblem mit Sql Server 2005 Volltextsuche ist, dass der Dienst von der relationalen Engine abgekoppelt ist, so Joins, Ordnungen, Aggregate und Filter zwischen den Volltext-Ergebnissen und der relationalen Spalten sind sehr teuer in der Leistung, Microsoft behauptet, dass diese Probleme in SQL Server 2008 behoben wurden, die Volltextsuche in der relationalen Engine integriert, aber ich habe es nicht getestet. Sie machten auch die gesamte Volltextsuche viel transparenter, in früheren Versionen waren die Stemmer, Stoppwörter und einige andere Teile der Indexierung, die wie eine Blackbox und schwer zu verstehen sind, und in der neuen Version leichter zu sehen, wie sie funktionieren.

Mit meiner Erfahrung, wenn SQL Server Ihre Anforderungen erfüllen, wird es der einfachste Weg sein, wenn Sie viel Wachstum erwarten, komplexe Abfragen oder eine große Kontrolle über die Volltextsuche benötigen, könnten Sie mit Lucene aus arbeiten der Start, weil es einfacher zu skalieren und zu personalisieren ist.

Verwandte Themen