2008-09-17 11 views
7

Ich untersuche Mechanismen für bessere Suchfunktionen gegen unsere Datenbank. Es ist derzeit ein großer Engpass (was langanhaltende Abfragen verursacht, die unsere Datenbankleistung beeinträchtigen).Wie suche ich am besten mit Lucene gegen eine DB?

Mein Chef wollte, dass ich in Solr schaue, aber bei näherer Betrachtung, es scheint, wir wollen tatsächlich eine Art DB-Integrationsmechanismus mit Lucene selbst.

Vom Lucene FAQ empfehlen sie Hibernate Search, Compass und DBSight .

Als Hintergrund unseres aktuellen Technologie-Stacks verwenden wir gerade JSPs auf Tomcat, keinen Hibernate, keine anderen Frameworks darüber ... einfach nur Java, JSP und JDBC gegen eine DB2-Datenbank.

Vor diesem Hintergrund scheint die Hibernate-Suche ein wenig schwieriger in unser System zu integrieren, obwohl es auch schön sein könnte, nach einer solchen Integration Hibernate zu verwenden.

Hat jemand irgendwelche Erfahrungen, die sie mit der Verwendung eines dieser Tools (oder anderer ähnlicher Lucene-basierter Lösungen) teilen können, die bei der Auswahl des richtigen Tools helfen könnten?

Es muss eine FOSS-Lösung sein, und im Idealfall wird die Aktualisierung von Lucene mit Änderungen aus der Datenbank automatisch (wenn auch effizient) verwaltet, ohne dass das Tool nach Änderungen extra benachrichtigt wird (andernfalls scheint es meine eigene Lucene zu rollen) Lösung wäre genauso gut). Außerdem verfügen wir über mehrere Anwendungsserver mit nur einer Datenbank (+ Failover). Es wäre also gut, wenn die Lösung problemlos von allen Anwendungsservern aus genutzt werden könnte.

Ich untersuche die Optionen jetzt noch, aber es wäre wirklich hilfreich, die Erfahrungen anderer zu nutzen.

+0

Haben Sie jemals Lucene eingebaut? –

Antwort

0

Für einen reinen Leistungsschub bei der Suche wird Lucene sicherlich viel helfen. Indexieren Sie nur, was Sie interessieren/brauchen und Sie sollten gut sein. Sie können Hibernate oder ein anderes Stück verwenden, wenn Sie möchten, aber ich denke nicht, dass es erforderlich ist.

+0

Danke für die Antwort! Leider würde ich wirklich gerne sehen, was diese Frameworks bieten können, damit ich meine eigene vollwertige Lösung nicht rollen muss. –

0

Nun, so scheint es, DBSight doesn't meet the FOSS requirement, so dass, wenn es sich um eine absolut stellaren Lösung ist, ist es keine Option ist das Richtige für mich jetzt ...

2

Ich habe mit Compass gute Erfahrungen gemacht. Es hat eine wirklich gute Integration mit Hibernate und kann Datenänderungen, die durch Hibernate und JDBC direkt an die Lucene-Indizes über seine GPS-Geräte http://www.compass-project.org/docs/1.2.2/reference/html/gps-jdbc.html gespiegelt werden.

Das Aufrechterhalten der Lucene-Indizes auf allen Ihren Anwendungsservern kann ein Problem darstellen. Wenn Sie die Datenbank mit mehreren App-Servern aktualisieren, treten möglicherweise Probleme auf, wenn der Index mit allen Änderungen synchron gehalten wird. Compass kann jetzt einen alternativen Mechanismus zur Handhabung haben.

Das Alfresco-Projekt (CMS) verwendet ebenfalls Lucene und verfügt über einen Mechanismus zum Replizieren von Lucene-Indexänderungen zwischen Servern, die bei der Behandlung dieser Probleme nützlich sein können.

Wir begannen mit der Verwendung von Compass, bevor die Hibernate-Suche wirklich auf dem Boden lag, so dass ich keinen Vergleich damit anbieten kann.

3

Wenn Sie sagen "Suche gegen eine DB", was meinst du?

Relationale Datenbanken und Information Retrieval-Systeme verwenden aus gutem Grund sehr unterschiedliche Ansätze. Welche Art von Daten suchen Sie?Welche Art von Anfragen führen Sie durch?

Wenn ich einen umgekehrten Index oben auf einer Datenbank implementieren würde, wie Compass, würde ich ihren Ansatz nicht verwenden, der Lucene Directory Abstraktion mit BLOBs implementieren soll. Stattdessen würde ich Lucenes IndexReader Abstraktion implementieren.

Relationale Datenbanken sind durchaus in der Lage, Indizes zu verwalten. Der Wert, den Lucene in diesem Zusammenhang bringt, sind seine Analysefähigkeiten, die für unstrukturierte Textdatensätze am nützlichsten sind. Ein guter Ansatz würde die Stärken jedes Tools nutzen.

Als Aktualisierungen des Index vorgenommen werden, erstellt Lucene mehr Segmente (weitere Dateien oder BLOBs), die die Leistung beeinträchtigen, bis ein teurer „optimieren“ -Verfahren verwendet wird. Die meisten Datenbanken amortisieren diese Kosten bei jeder Indexaktualisierung, wodurch Sie eine stabilere Leistung erhalten.

1

Mit LuSql http://code.google.com/p/lusql/ können Sie den Inhalt einer für JDBC zugänglichen Datenbank in Lucene laden, sodass sie durchsucht werden kann. Es ist hoch optimiert und multi-threaded. Ich bin der Autor von LuSql und werde im nächsten Monat eine neue Version herausbringen (die mit einer neuen Plug-in-Architektur ausgestattet wurde).

Verwandte Themen