2009-11-18 7 views
8

Ich verwende Lucene, um eine kleine Anzahl großer Dokumente zu indizieren und zu durchsuchen. Mit der Demo von der Lucene-Seite habe ich die Dokumente indiziert und kann sie durchsuchen. Das Suchergebnis ist jedoch nicht besonders nützlich, da es auf die Datei des Dokuments zeigt. Bei sehr großen Dokumenten ist dies nicht besonders nützlich.Kann Lucene mehrere Suchergebnisse aus einer einzelnen indizierten Datei zurückgeben?

Ich frage mich, ob Lucene diese sehr großen Dokumente indizieren und eine Abstraktion über sie erstellen kann, die viel feinkörnigere Ergebnisse liefert.

Ein Beispiel könnte besser erklären, was ich meine. Betrachten Sie ein sehr großes Buch, wie die Bibel. Eine Datei enthält den gesamten Text der Bibel, also würde bei der Demo das Ergebnis der Suche nach "Damaskus" auf die Datei zeigen. Was ich tun möchte, ist das große Dokument beizubehalten, aber Suchen würden Ergebnisse zurückgeben, die auf ein Buch, ein Kapitel oder sogar so genau wie ein Vers verweisen. So könnte eine Suche nach "Damaskus" (unter anderem) Buch 23, Kapitel 7, Vers 8 zurückgeben.

Ist dies möglich (und Best Practice in Lucene Verwendung), oder sollte ich stattdessen versuchen, das große Dokument in viele kleine Dateien zum Indexieren?

Wenn es einen Unterschied macht, verwende ich Java Lucene 2.9.0 und indexiere HTML-Dateien mit einer Größe von ca. 1MB - 4MB. Was in Bezug auf die Dateigröße nicht groß ist, aber es ist groß, relativ zu einer Person, die es liest.


Ich glaube nicht, dass ich das so gut erklärt habe, wie ich konnte. Hier ein anderes Beispiel.

Sagen wir, ich nehme meine große HTML-Datei, und (aus Gründen des Willens) erscheint der Suchbegriff 'Damaskus' dreimal. Einmal auf der Linie 100 innerhalb eines Tags <div>, auf der Linie 2000 innerhalb eines Tags <p> und auf der Linie 5000 innerhalb eines Tags <h1>. Ist es möglich, mit Lucene zu indizieren, so dass es 3 Ergebnisse gibt und sie auf das spezifische Element zeigen können, in dem sich der Begriff befand?

Ich glaube nicht, dass ich ein anderes Dokument Ergebnis für den Begriff bereitstellen möchte. Wenn also der Begriff "Damaskus" zweimal in einem spezifischen <div> erscheint, würde es nur eine Übereinstimmung geben.

Es scheint aus einem Kommentar von Kragen, was ich tun möchte, ist das HTML analysieren, wenn Lucene die Indexierungsphase durchläuft. Dann kann ich den Chunk bestimmen, den ich als ein Dokument betrachten möchte, von dem, was vom Parser eingelesen wird. Wenn ich also ein div mit einer bestimmten Klasse sehe, kann ich ein neues Lucene-Dokument beginnen und es wird als separater Treffer zurückgegeben, wenn nach einem Wort innerhalb des div-Inhalts gesucht wird.

Klingt das wie das, was ich tun möchte, und ist es möglich?

Antwort

1

Ja - Lucene zeichnet den Versatz der übereinstimmenden Begriffe in einer Datei auf, damit Sie herausfinden können, wo im indizierten Inhalt nach Übereinstimmungen gesucht werden soll.

Es gibt ein Lucene.Highlight-Add-on, das genau diese Aufgabe für Sie erledigt - versuchen Sie this article, es gibt auch einige Fragen zu StackOverflow bezüglich Hit-Hervorhebung (viele davon sind für die Verwendung mit Web-Apps und so auch zugeschnitten) Dinge tun, wie rund um passende Worte mit <b> Tags)

UPDATE: Je nachdem, wie Sie Ihren Index zu suchen könnten Sie auch feststellen, dass es eine gute Idee, um Ihre große Dokumente in kleinere Abschnitte aufzuteilen (zB Kapitel) als auch - Dies ist jedoch eher eine Frage darüber, wie Sie Ihre Ergebnisse organisieren, priorisieren und dem Endnutzer präsentieren möchten.

Angenommen, ein Benutzer sucht nach "foo" und es gibt 2 Bücher, die diesen Begriff enthalten. Das erste Buch (Buch A) könnte 2 Kapitel enthalten, von denen jedes viele Verweise auf "foo" enthält, jedoch wird der Begriff im Rest des Buches kaum erwähnt, jedoch enthält das zweite Buch (Buch B) viele Verweise auf "foo" aber sie sind um das ganze Buch verstreut. Wenn Sie nach Buch indexieren, werden Sie wahrscheinlich feststellen, dass Buch B der erste Treffer ist. Bei der Indexierung nach Kapitel werden Sie jedoch wahrscheinlich feststellen, dass die 2 Kapitel aus Buch A die ersten 2 sind, gefolgt von den Kapiteln aus Buch B.

Schließlich wird dem Benutzer offensichtlich 1 Treffer pro passendem Dokument angezeigt, das Sie in Ihrem Index haben. Wenn Sie Ihren Nutzern eine Liste passender Bücher präsentieren möchten, dann natürlich Index für Buch, aber Sie finden es möglicherweise passender Legen Sie dem Benutzer eine Liste mit passenden Kapiteln vor, in diesem Fall offensichtlich nach Kapiteln.

+0

In Ihrem Beispiel kann ich Buch B als eine einzige Datei, in meinem Fall eine HTML-Datei, speichern und mehrere Lucene-Dokumente innerhalb dieser Datei erstellen, so dass alle Ergebnisse der einzelnen Datei dem Benutzer als diskret gemeldet werden können Treffer? Ist es möglich, nach Kapiteln zu indizieren, wenn die Kapitel in der gleichen * Datei * liegen? Danke für Ihre Antwort :) – Grundlefleck

+0

Sie können nach Kapiteln indizieren, indem Sie Lucene nur eine Teilmenge dieser Datei angeben, wenn Sie indexieren - dies ergibt 1 Treffer pro passendem Kapitel. Wenn Sie dem Benutzer einen Treffer pro diskreter Übereinstimmung präsentieren möchten, müssen Sie alle Vorkommen für jedes übereinstimmende Dokument durchgehen. Es gibt keine Möglichkeit, ein Buch in genügend Lucene-Dokumente aufzuteilen, sodass jeder Treffer garantiert ist entsprechen genau 1 Vorkommen dieses Wortes/Satzes. – Justin

0

Eine Möglichkeit besteht darin, mehrere Dokumente aus einem einzigen Buch zu erstellen. Die Dokumente könnten Bücher, Kapitel oder Verse darstellen. Da der Text nicht eindeutig sein muss, würde ich dies tun. Auf diese Weise wird der erste Vers im ersten Kapitel des Buches Genesis viermal indiziert: in der ganzen Bibel, im Buch Genesis, im ersten Kapitel und als Vers.

Eine Feinheit hier ist das genaue Ziel des Abrufs: Möchten Sie nur die Suchbegriffe im Kontext zu einem Benutzer anzeigen? Verwenden Sie in diesem Fall eine Lucene highlighter. Wenn Sie möchten, dass der Abruf weiter verwendet wird (d. H. Den abgerufenen Zeiger zu einem Kapitel oder einem Vers nimmt und an dieser Stelle im Text etwas verarbeitet), würde ich mit den feinkörnigeren Dokumenten gehen, wie ich zuvor beschrieben habe.

+0

Ziel ist es, den HTML-Code in einer Swing-Anwendung anzuzeigen. Die Suchergebnisse ermöglichen dem Benutzer, zu diesem Teil des HTML zu navigieren. Die Suche kann auch eine Vorschau bereitstellen. Nur um klar zu sein, wenn Sie sagen, "mehrere Dokumente aus einem einzigen Buch erstellen", meinen Sie Lucene-Dokumente oder neue Dateien? – Grundlefleck

+0

Ich meine Lucene Dokumente. –

Verwandte Themen