Wie erreicht Lucene / Solr eine hohe Leistung bei der Multi-Feld / Facettensuche?

8

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.

    
ron 05.04.2011, 13:49
quelle

2 Antworten

5

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.

  1. Enum facettieren. Ergebnisse einer Abfrage sind ein Bitvektor, bei dem das i-te Bit 1 ist, wenn das i-te Dokument eine Übereinstimmung war. Die Facette ist auch ein Bitvektor, also ist Kreuzung nur ein bitweises UND. Ich denke nicht, dass dies ein neuer Ansatz ist, und die meisten RDBMS unterstützen es wahrscheinlich.
  2. 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.

    
Xodarap 06.04.2011, 15:31
quelle
3

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.

    
ron 07.04.2011 12:09
quelle