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.
Antworten:
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
varchar
Feld 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.
quelle
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
quelle
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.
quelle
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.
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).
quelle