Kann Lucene mehrere Suchergebnisse aus einer einzelnen indizierten Datei zurückgeben?

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.

Ich frage mich, ob Lucene diese sehr großen Dokumente indexieren 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ückkehren.

Ist das möglich (und die beste Vorgehensweise in Lucene), oder sollte ich stattdessen versuchen, das große Dokument in viele kleine Dateien zu indizieren?

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 ist nicht groß, 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 in Zeile 100 innerhalb eines <div> -Tags, in Zeile 2000 innerhalb eines <p> -Tags und in Zeile 5000 innerhalb eines <h1> -Tags. Ist es möglich, mit Lucene zu indizieren, so dass es 3 Ergebnisse gibt, und sie auf das spezifische Element verweisen können, in dem sich der Begriff befand?

Ich glaube nicht, dass ich ein anderes Dokumentenergebnis für den Begriff liefern möchte. Wenn also der Begriff "Damaskus" zweimal innerhalb einer bestimmten <div> auftaucht, gibt es nur eine Übereinstimmung.

Es erscheint aus einem Kommentar von Kragen , was ich tun möchte, ist das HTML zu 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 nach dem, was ich tun möchte, und ist es möglich?

    
Grundlefleck 18.11.2009, 11:11
quelle

2 Antworten

1

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

Es gibt ein Lucene.Highlight-Add-on, das genau diese Aufgabe für Sie erledigt - versuchen Sie diesen Artikel , Es gibt auch ein paar Fragen zu StackOverflow bezüglich der Hervorhebung von Treffern (viele davon sind speziell auf die Verwendung mit Web-Apps zugeschnitten und machen auch Dinge wie das Umschließen von Wörtern mit <b> -Tags)

UPDATE: Je nachdem, wie Sie Ihren Index durchsuchen, ist es auch eine gute Idee, Ihre großen Dokumente in kleinere Abschnitte (z. B. Kapitel) aufzuteilen - dies ist jedoch eher eine Frage wie Sie Ihre Ergebnisse organisieren, priorisieren und dem Endbenutzer 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 Treffer sind, gefolgt von den Kapiteln aus Buch B.

Schließlich wird dem Nutzer offensichtlich 1 Treffer pro passendem Dokument in Ihrem Index angezeigt - wenn Sie Ihren Nutzern eine Liste passender Bücher präsentieren möchten, dann natürlich nach Buch, aber vielleicht finden Sie es passender präsentiere dem Benutzer eine Liste passender Kapitel, in diesem Fall offensichtlich nach Kapiteln.

    
Justin 18.11.2009, 14:16
quelle
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 ist hier das genaue Ziel des Abrufs: Möchten Sie die Suchschlüsselwörter nur im Zusammenhang mit einem Benutzer anzeigen? In diesem Fall sollten Sie einen Highlighter verwenden. 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 die feinkörnigeren Dokumente wie zuvor beschrieben verwenden.

    
Yuval F 18.11.2009 12:14
quelle

Tags und Links