DB2 Search mit Lucene

  • Hallo,

    hab mir hier schon einiges im Forum durchgelesen und möchte nun meinen Einstand direkt mal mit einer Frage zu Lucene feiern :)

    Mein Ziel ist die Entwicklung eines Query Parsers z.B. für eine DB2 Datenbank (wobei das natürlich schnurz ist). Mein Problem dabei ist, dass ich meine Suchfelder (Tabellen, Spalten) ja bereits bei der Implementierung setzen muss. Gibt es eine Möglichkeit, die Felder z.B. erst zur Laufzeit festzulegen, sodass bei einem Update des Datenschemas auch die Suche angepasst werden kann (also neue Spalten, Tabellen in die Suche einbezogen werden können)? Alle Implementierungen die ich mir bisher angeschaut habe waren in dieser Beziehung leider statisch.

    Würde mich über eure Hilfe sehr freuen! Bin leider noch einigermaßen neu auf dem Gebiet JavaCC.

    Viele Grüße,
    Patrick

  • Hallo Patrick,

    Ich weiss nicht ob Du dir bereits das apache projekt http://solr angeschaut hast, aber meiner Meinung gibt es kaum noch Gruende dafuer, Lucene ohne solr zu verwenden. Solr erlaubt auch das on the fly anlegen von neuen Feldern.

    Allerdings ist das dynamische Aendern des Indexes eigentlich nur selten wirklich notwendig. Wenn Dein Datenbestand nicht gerade mehrere Terrabyte gross ist, dann zahlt sich eventuell das einfache neuindizieren aus.

    Das Indexing selbst ist naemlich ziemlich schnell, updates sind wesentlich teurer. D.h. die Fragen sind eigentlich:

    Wie viele Daten sind in der Datenbank (Platzverbrauch und Anzahl der Records)?

    Wie oft macht ihr Aenderungen am Datenbankschaema?

    Wie synchron muessen die beiden Komponenten wirklich sein?

    Kann der Index dem Datenbestand auch mal "hinterherhinken"? Wie lange?

  • Hallo Benjamin,

    vielen Dank für deine schnelle Antwort! Hab ich heute Abend wirklich nicht mehr mit gerechnet :thumb:.

    Erlich gesagt weiß ich nicht genau wie groß der Datenbestand sein wird. Da es sich dabei allerdings um Dokumente (z.B. Spezifikationen) und Modelle aus dem CAD Bereich handelt kann der Umfang schon größer werden (zumindest was den Speicherplatz betrifft).

    Werde mir zu deinen übrigen Fragen mal ernsthaft Gedanken machen müssen!

    Werde mir solr mal genau anschauen, denn auf Java.net habe ich ein kleines Tutorial zur Indizierung gefunden:
    http://today.java.net/pub/a/today/20…uceneIntro.html

    Im Beispiel wird folgendermaßen verfahren:

    • Create an IndexWriter.
    • Locate each file to be indexed by walking the directory looking for file names ending in .txt.
    • For each text file, create a Document with the desired Fields.
    • Add the document to the IndexWriter instance.

    Punkt drei interessiert mich besonders. Die Felder müssen ja zur Buildtime festgelegt werden um sie später in den Anfragen des Users nutzen zu können (?). Was mache ich wenn ich ein neues Feld einführen möchte um dieses später in einer Anfrage an die Datenbank einsetzen zu können, ohne den Code händisch ändern und neu compilieren zu müssen? Das wäre doch zum Erreichen dieses Ziels durch erneute Indizierung notwendig oder nicht?
    Wenn mir solr dabei hilft nicht nochmal in den Code eingreifen zu müssen wäre das Problem gelöst. Hoffe ich hab nicht alles falsch verstanden...

    Nochmals vielen Dank für deine schnelle Antwort und Hilfe!

    Viele Grüße,
    Patrick

  • Erlich gesagt weiß ich nicht genau wie groß der Datenbestand sein wird. Da es sich dabei allerdings um Dokumente (z.B. Spezifikationen) und Modelle aus dem CAD Bereich handelt kann der Umfang schon größer werden (zumindest was den Speicherplatz betrifft).

    Fuer mich klingt das nicht so schlimm: Es hoert sich so an, als waehre da ein ueberschaubares Team von Benutzern die immer wieder mal Daten raufladen. Auch wenn die Dokumente selbst gross sind, werden vermutlich nicht 1000 neue Dokumente pro Minute erstellt. Diese Menge in kurzer Zeit zu indizieren sollte ueberhaupt kein Problem darstellen. Ich definiere "in kurzer Zeit" absichtlich nicht, da ich ja nur wenig Informationen habe.


    Im Beispiel wird folgendermaßen verfahren:

    • Create an IndexWriter.
    • Locate each file to be indexed by walking the directory looking for file names ending in .txt.
    • For each text file, create a Document with the desired Fields.
    • Add the document to the IndexWriter instance.

    Das ist der Vorgang bei Lucene. Wenn Du da mehr Beispielcode brauchst: Ich habe hier ein kurzes Beispiel in Ruby/Java, wo ich Daten von twitter.com in einen Index spiele:

    http://blog.bookworm.at/2007/04/twitter-lucene.html

    In einer Produktivumgebung gibt es aber meistens noch mehr Dinge zu beachten, darum habe ich solr empfohlen.

    Eine 10 Minuten Einfuehrung in solr findest Du hier: http://lucene.apache.org/solr/tutorial.html


    Punkt drei interessiert mich besonders. Die Felder müssen ja zur Buildtime festgelegt werden um sie später in den Anfragen des Users nutzen zu können (?). Was mache ich wenn ich ein neues Feld einführen möchte um dieses später in einer Anfrage an die Datenbank einsetzen zu können, ohne den Code händisch ändern und neu compilieren zu müssen?
    Das wäre doch zum Erreichen dieses Ziels durch erneute Indizierung notwendig oder nicht?

    Ja: Was Du in dem Index speichern willst, bleibt Dir ueberlassen. Das kann Deine Software ja nicht wissen. Du kannst natuerlich Code schreiben, der sich das Datenbankschema anschaut und daraus heraus dann entscheidet, welche Felder der neue Index haben soll. Aber eine bestehende Loesung, um den Index dynamisch mit dem gesamten Datenbankschema zu synchronisieren, gibt es meines Wissens nach nicht.

    Du willst in der Regel aber gar nicht alle Felder aus allen Tabellen in der Datenbank fuer den Index indizieren. Sondern eben nur die Daten, in denen wirklich gesucht werden soll. Und ueblicherweise aendert man an seinem Datenbankschema ja nicht oft etwas.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!