2013-02-27 17 views
8

Ich bin ziemlich neu in Lucene, so möchte etwas Hilfe von euch bekommen :)Lucene und SQL Server - Best Practice

HINTERGRUND: Zur Zeit habe ich Dokumente in SQL Server gespeichert und wollen für volle Lucene verwenden -text/tag sucht in diesen Dokumenten in SQL Server.

Q1) Sollte ich in diesem Fall alle diese Dokumente in den Lucene-Index einfügen, um die Stichwortsuche an den Dokumenten durchzuführen? Bedeutet dies, dass es Datenduplizierungen geben wird (eine in SQL Server und die andere im Lucene-Index?). Es könnte eine Frage sein, da wir eine riesige Menge an Dokumenten haben (etwa 100 GB). Ist es unvermeidlich?

Q2) Auch jedes Dokument hat eine Reihe von Tags (bis zu 3). Lucene ist auch eine gute Wahl für die Tag-Suche? Wenn ja, wie?

Danke,

Antwort

5

Ja, Volltextsuche durch Lucene und Datenspeicherung durch eine traditionelle Datenbank-Architektur eine gut unterstützte bereitstellt. , für eine kurze Einführung. Eine typische Implementierung besteht darin, alles zu indizieren, das die Suche unterstützen soll, und nur einen eindeutigen Bezeichner im Lucene-Index zu speichern und alle Datensätze, die durch eine Suche gefunden wurden, basierend auf der ID aus der Datenbank abzurufen. Wenn Sie die Datenbanklast reduzieren möchten, können Sie einige Informationen in Lucene speichern, um eine Liste der Suchergebnisse anzuzeigen, und nur die Datenbank abfragen, um das vollständige Dokument abzurufen.

Da Speicherplatz gespart wird, gibt es ein gewisses Maß an Duplizierung. Dies gilt auch, wenn Sie nur Lucene, obwohl. Lucene speichert den invertierten Index, der zum Suchen ganz getrennt von den gespeicherten Daten verwendet wird. Um Platz zu sparen, empfehle ich, sehr genau darüber nachzudenken, welche Daten Sie indexieren und was Sie speichern und später abrufen können. Was Sie speichern, ist besonders wichtig, um in Lucene Platz zu sparen, da indexierte Werte in den meisten Fällen sehr platzsparend sind.

Lucene kann sicherlich eine Tag-Suche implementieren. Der einfache Weg, es zu implementieren wäre jeden Tag auf ein Feld Ihrer Wahl hinzuzufügen (ich nenne ist „Tags“, die sinnvoll erscheint), beim Aufbau des Dokuments, wie zum Beispiel:

document.add(new Field("tags", "widget", Field.Store.NO, Field.Index.ANALYZED)); 
document.add(new Field("tags", "forkids", Field.Store.NO, Field.Index.ANALYZED)); 

und ich könnte einfach einen erforderlichen Begriff zu jeder Abfrage hinzufügen, um nur innerhalb eines bestimmten Tags zu suchen. Zum Beispiel, wenn ich nach "ein paar Sachen" suchen sollte, aber nur mit dem Tag "forkids", könnte ich eine Abfrage schreiben wie:

1

Dokumente auch in Lucene gespeichert werden kann, können Sie sie mit dem Dokument-ID abrufen und verweisen.

Ich würde vorschlagen, Solr http://lucene.apache.org/solr/ auf Lucene, ist benutzerfreundlicher und hat multiValued Felder (für die Tags) standardmäßig zur Verfügung.

http://wiki.apache.org/solr/SchemaXml

+0

Danke für Ihre Antwort. Denkst du, dass die Pflege von Dokumenten nur in Lucene eine allgemeine Architektur wäre? Gibt es einen Fall, Daten in Datenbank und Lucene zu pflegen? – soleiljy

+0

Wenn Sie nur an den tatsächlichen Inhalten und einigen Metadaten interessiert sind, sehe ich keine Notwendigkeit für eine zusätzliche Datenbank. – Elmer