Wie funktioniert Lucene/Solr erreichen hohe performance im multi-Feld / faceted search?
Kontext
Dies ist eine Frage, die vor allem über Lucene (oder vielleicht Solr) - Interna. Das Hauptthema ist facettierte Suche, in der die Suche kann passieren, entlang mehrerer voneinander Unabhängiger Dimensionen (Facetten) von Objekten (zum Beispiel Größe, Geschwindigkeit, Preis für ein Auto).
Bei der Implementierung mit relationaler Datenbank, für die eine große Anzahl von Facetten multi-Feld-Indizes sind nicht sinnvoll, da Facetten durchsucht werden können, in beliebiger Reihenfolge, so dass eine bestimmte bestellten multi-index verwendet wird, mit geringer chance, und die Erstellung aller möglichen Ordnungen von Indizes ist unerträglich.
Solr beworben wird, gut zu bewältigen mit der facettierten Suche Aufgabe, die, wenn ich glaube, richtig muss verbunden werden mit Lucene (angeblich) gut auf multi-Feld-Abfragen (wo die Felder eines Dokuments beziehen sich auf Facetten eines Objekts).
Frage
Den invertierten index von Lucene kann in einer relationalen Datenbank gespeichert, und natürlich nehmen die Schnittpunkte des übereinstimmenden Dokumente können auch trivial erzielt mit RDBMS mit single-Feld-Indizes.
Daher, Lucene hat angeblich einige fortgeschrittene Technik für multi-Feld-Abfragen als nur die Einnahme der Kreuzung von passenden Dokumenten basierend auf den invertierten index.
Ist also die Frage, was das für eine Technik/trick? Allgemein: Warum kann Lucene/Solr erreichen besser facettierte Suche Leistung theoretisch als RDBMS könnte (falls es so ist)?
Anmerkung: Meine erste Vermutung wäre, dass Lucene verwenden würden, einige space partitioning-Methode für die Partitionierung eines Vektorraums gebaut, aus dem Dokument die Felder als Dimensionen, aber so wie ich das verstehe Lucene ist nicht rein Vektorraum basiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Facettierung
Gibt es zwei Antworten für Facettierung, denn es gibt zwei Arten von Facettierung. Ich bin mir nicht sicher, die beiden sind schneller als ein RDBMS.
Feld Cache. Dies ist nur eine normale (nicht-invertierter) index. Die SQL-Stil-Abfrage, die ausgeführt wird, ist hier wie:
wählen Sie die Facette, count(*) from field_cache
wo docId in query_results
Gruppe von Facette
Wieder, ich glaube nicht, das ist alles, was eine normale RDBMS nicht tun konnte. Der index ist eine skip-Liste, mit der docId als Schlüssel.
Multi-term-Suche
Dies ist, wo Lucene scheint. Warum Lucene-Ansatz ist so gut, ist zu lang um hier zu posten, aber ich kann empfehlen,dieser Beitrag auf Lucene Performance, oder die Papiere, die darin verlinkten.
Erklärende Beitrag finden Sie unter: http://yonik.wordpress.com/2008/11/25/solr-faceted-search-performance-improvements/