Wie funktioniert Lucene?

90

Ich würde gerne herausfinden, wie die Lucene-Suche so schnell funktioniert. Ich kann keine nützlichen Dokumente im Web finden. Wenn Sie etwas (außer Lucene-Quellcode) zu lesen haben, lassen Sie es mich wissen.

Eine Textsuchabfrage mit der mysql5-Textsuche mit Index dauert in meinem Fall ungefähr 18 Minuten. Eine Lucene-Suche nach derselben Abfrage dauert weniger als eine Sekunde.

Midhat
quelle
2
Kann ich beantragen, dass diese Frage als Community-Wiki konvertiert wird? Lucene klingt jetzt wie eine Plattform.
Asyncwait

Antworten:

74

Lucene ist ein invertierter Volltextindex. Dies bedeutet, dass alle Dokumente verwendet, in Wörter aufgeteilt und dann für jedes Wort ein Index erstellt wird . Da der Index eine exakte, ungeordnete Zeichenfolgenübereinstimmung ist, kann er extrem schnell sein. Hypothetisch könnte ein ungeordneter SQL-Index für ein varcharFeld genauso schnell sein, und ich denke, Sie werden feststellen, dass die großen Datenbanken in diesem Fall eine einfache Abfrage der Zeichenfolgengleichheit sehr schnell durchführen können.

Lucene muss nicht für die Transaktionsverarbeitung optimieren. Wenn Sie ein Dokument hinzufügen, muss nicht sichergestellt sein, dass Abfragen es sofort sehen . Und es muss nicht für Aktualisierungen vorhandener Dokumente optimiert werden.

Am Ende des Tages müssen Sie jedoch die Quelle lesen, wenn Sie es wirklich wissen möchten. Beide Dinge, auf die Sie verweisen, sind schließlich Open Source.

bmargulies
quelle
Wenn ich das richtig verstehe, unterscheidet sich Textsuchmaschinen dadurch, wie sie Mehrwortsuchen verarbeiten und die Suchergebnisse in Echtzeit mit mehreren Indizes verknüpfen. Ich würde nicht empfehlen, Lucene Source zu konsultieren. Es wäre wahrscheinlich besser, ein wenig über die Theorie der Textsuche zu lesen. Die Antwort von @ alienCoder hat mir geholfen.
Chris Dutrow
1
@bmargulies, Wenn die Indizierung "pro Wort" lautet, warum erlaubt die Stackoverflow-Benutzersuche stackoverflow.com/users dann Teilstring-Übereinstimmungen?
Pacerier
2
Dies ist nicht der richtige Ort für Antworten auf ganze Bücher. Es gibt dort eine beliebige Anzahl von Ausarbeitungen zum Grundkonzept.
Bmargulies
Was meinst du mit "ein Index für jedes Wort" ... wenn ich anfange, "abc" einzugeben, wie wird "abc" im Dokument gefunden?
Alexander Mills
1
Ein Index (B-Baum) von Wort zu Dokument kann nach Dokumenten nach Wörtern im Dokument suchen, da sich die Tabelle eines solchen Index (Wort, Dokument) befindet, in der sich der Index in der Wortspalte befindet. Stellen Sie sich eine Abfrage wie "Suchen Sie Dokumente mit den Wörtern" Polizei "," Verbrechen "," Statistik "" vor. Durch Durchsuchen des Wortindex können Sie drei Protokollsuchen (N) durchführen, um O (N) -Dokumente mit einem dieser Wörter zu erhalten. Anschließend können Sie zwei O (N) -Schleifen ausführen, um einen Satz mit Dokumenten zu erstellen, die alle drei Wörter enthalten. Obwohl dies theoretisch eine O (N)
-Operation ist
34

Lucene erstellt einen großen Index. Der Index enthält die Wort-ID, die Anzahl der Dokumente, in denen das Wort vorhanden ist, und die Position des Wortes in diesen Dokumenten. Wenn Sie also eine einzelne Wortabfrage geben, wird nur der Index durchsucht (O (1) -Zeitkomplexität). Dann wird das Ergebnis unter Verwendung verschiedener Algorithmen eingestuft. Bei Abfragen mit mehreren Wörtern nehmen Sie einfach den Schnittpunkt der Dateien, in denen die Wörter vorhanden sind. Somit ist Lucene sehr sehr schnell.

Weitere Informationen finden Sie in diesem Artikel von Google-Entwicklern unter http://infolab.stanford.edu/~backrub/google.html

alienCoder
quelle
8
Das Papier überflogen, war ziemlich hilfreich. Insbesondere "4.5 Searching" hatte die Antwort, die ich suchte. Insbesondere klingt es so, als würde eine O (1) -Hash-Suche für einzelne Wörter verwendet, aber dann wird ein O (n) -Scan verwendet, um die Ergebnisse mit einem Dokumentlimit von 40.000 zu verknüpfen. Ich gehe davon aus, dass ein Map-Reduction-Algorithmus verwendet wird, um diese Arbeit so aufzuteilen, dass der Benutzer sofort Ergebnisse erhält.
Chris Dutrow
Ein beliebter Algorithmus ist der Taubenrang-Algorithmus. Obwohl ich nicht viel darüber weiß.
AlienCoder
3
Das Papier ist amüsant: "In diesem Papier präsentieren wir Google, einen Prototyp ...". Ich denke, Google war nicht immer ein Mega-Unternehmen.
Buttons840
Ich kenne Lucene nicht, aber eine Frage: Ranking findet bei jeder Suche statt? Oder werden die vorrangigen Dokumente beibehalten? Wenn die Dokumente im Voraus nach Rang verwaltet werden, wie werden dann mehrere Wörter abgefragt?
Vikas Prasad
20

Mit einem Wort: Indizierung.

Lucene erstellt einen Index Ihres Dokuments, mit dem es viel schneller suchen kann.

Es ist der gleiche Unterschied zwischen einer Datenstruktur der Liste O (N) und einer Datenstruktur der Hash-Tabelle O (1). Die Liste muss durch die gesamte Sammlung gehen, um zu finden, was Sie wollen. Die Hash-Tabelle verfügt über einen Index, mit dem sie genau herausfinden kann, wo sich das gewünschte Element befindet, und es einfach abrufen kann.

Aktualisieren:

Ich bin mir nicht sicher, was Sie unter "Lucene-Indexsuchen sind viel schneller als MySQL-Indexsuchen" verstehen.

Ich vermute, dass Sie MySQL "WHERE document LIKE '% Phrase%'" verwenden, um nach einem Dokument zu suchen. Wenn das stimmt, muss MySQL in jeder Zeile einen Tabellenscan durchführen, der O (N) ist.

Lucene kann das Dokument in Token analysieren, sie in Ihrer Richtung in n-Gramm gruppieren und für jedes dieser Indizes Indizes berechnen. Es ist O (1), ein Wort in einem indizierten Lucene-Dokument zu finden.

Duffymo
quelle
10
Ja, ich verstehe den Indizierungsteil, aber auch hier sind Lucene-Indexsuchen viel schneller als MySQL-Indexsuchen. Wie passiert das
Midhat
8

Lucene arbeitet mit Termhäufigkeit und inverser Dokumenthäufigkeit . Es wird ein Index erstellt, der jedes Wort dem Dokument zuordnet, und seine Häufigkeitszahl ist nichts anderes als ein inverser Index für das Dokument.

Beispiel :

Datei 1: Direktzugriffsspeicher ist der Hauptspeicher.

Datei 2: Festplatten sind Sekundärspeicher.

Lucene erstellt so etwas wie einen umgekehrten Index

Datei 1:

Begriff: Zufällig

Häufigkeit: 1

Position: 0

Begriff: Speicher

Häufigkeit: 2

Position: 3

Position: 6

So kann der gesuchte Inhalt schnell gesucht und abgerufen werden. Wenn zu viele Übereinstimmungen für die Suchabfrage vorhanden sind, wird das Ergebnis basierend auf der Gewichtung ausgegeben. Betrachten Sie die Suchabfrage "Hauptspeicher" , die einzeln nach allen 4 Wörtern sucht, und das Ergebnis wäre wie folgt:

Main

Datei 1: Häufigkeit - 1

Erinnerung

Datei 1: Häufigkeit - 2

Datei 2: Häufigkeit - 1

Das Ergebnis wäre Datei1, gefolgt von Datei2 . Um zu verhindern, dass Gewichte für die gängigsten Wörter wie 'und', 'oder', 'das' die inverse Dokumenthäufigkeit berücksichtigen (dh 'verringert es das Gewicht des Wortes, das im Dokumentensatz am beliebtesten ist).

Tom Taylor
quelle