Kontext
Dies ist eine Frage hauptsächlich über Lucene (oder möglicherweise Solr) Interna. Das Hauptthema ist die facettierte Suche , in der die Suche nach mehreren unabhängigen Dimensionen (Facetten) von Objekten (z. B. Größe, Geschwindigkeit, Preis eines Autos) erfolgen kann.
Bei der Implementierung mit einer relationalen Datenbank sind Multi-Feld-Indizes für eine große Anzahl von Facetten nicht nützlich, da Facetten in jeder Reihenfolge durchsucht werden können, so dass ein bestimmter geordneter Multi-Index mit geringer Wahrscheinlichkeit verwendet wird und alle möglichen Ordnungen erzeugt werden von Indizes ist unerträglich.
Solr wird damit beauftragt, die facettierte Suchaufgabe gut zu meistern, die, wenn ich richtig denke, mit Lucene verbunden sein muss (angeblich) bei Mehrfeldabfragen (wo sich Felder eines Dokuments auf Facetten eines Objekts beziehen).
Frage
Der invertierte Index von Lucene kann in einer relationalen Datenbank gespeichert werden, und natürlich können die Kreuzungen der übereinstimmenden Dokumente auch mit RDBMS mit Einzelfeldindizes einfach erreicht werden.
Daher hat Lucene angeblich eine fortgeschrittene Technik für Multi-Field-Abfragen, die nicht nur die Schnittmenge passender Dokumente auf Basis des invertierten Indexes darstellt.
Die Frage ist also, was ist diese Technik / Trick? Allgemeiner: Warum kann Lucene / Solr theoretisch eine bessere Leistung der facettierten Suche erreichen als RDBMS (wenn ja)?
Hinweis: Meine erste Vermutung wäre, dass Lucene eine Partitionierungsmethode verwenden würde, um einen aus den Dokumentenfeldern erstellten Vektorraum als Dimensionen zu partitionieren, aber Lucene ist meines Wissens nicht rein vektorraumbasiert.
Facettierung
Es gibt zwei Antworten für die Facettierung, da es zwei Arten von Facetten gibt. Ich bin mir nicht sicher, dass beide schneller als ein RDBMS sind.
Feldcache. Dies ist nur ein normaler (nicht invertierter) Index. Die Abfrage im SQL-Stil, die hier ausgeführt wird, ist wie folgt:
wähle Facette, zähle (*) von field_cache wo docId in query_results Gruppe nach Facette
Ich glaube nicht, dass dies alles ist, was ein normales RDBMS nicht kann. Der Index ist eine Überspringungsliste mit der docId als Schlüssel.
Mehrfachsuche
Hier leuchtet Lucene. Warum Lucenes Ansatz so gut ist, ist zu lang, um hier zu posten, aber ich kann diesen Beitrag zu Lucene Performance oder die darin verlinkten Papiere.
Ein erklärender Beitrag finden Sie unter: Ссылка
Die neue Methode funktioniert, indem das indizierte Feld, das facettiert werden soll, umgekehrt wird. Dies ermöglicht eine schnelle Suche nach den Begriffen im Feld für ein bestimmtes Dokument. Es ist eigentlich ein hybrider Ansatz - um Speicher zu sparen und die Geschwindigkeit zu erhöhen, sind Begriffe, die in vielen Dokumenten vorkommen (über 5%), nicht umgekehrt, stattdessen wird die traditionelle Mengenschnittpunktlogik verwendet, um die Zählungen zu erhalten.
Tags und Links lucene faceted-search internals