Der schnellste Weg, um die Länge des Schnittpunkts zweier Textarrays in PostgreSQL zu ermitteln

7

Folgendes verwende ich derzeit:

CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$ 
  SELECT ARRAY(
    SELECT unnest($1)
    INTERSECT SELECT unnest($2)
    ORDER BY 1
  );
$$ LANGUAGE sql
IMMUTABLE STRICT;


--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);

Gibt es einen schnelleren Weg?

Neil McGuigan
quelle
1
Sieht für Allzweck-Arrays nicht so aus. Für ganzzahlige Arrays stellt die intarrayErweiterung den &Operator bereit , aber es scheint trotz des &&Booleschen Tests für überlappende Arrays nicht für alle Arrays einen verallgemeinerten zu geben . Es wäre schön hinzuzufügen, aber ... nun, werfen Sie einen Blick auf den C-Quellcode für die PostgreSQL-Allzweck-Array-Funktionen und -Operatoren, um zu sehen, warum es nicht so viele gibt, wie Sie vielleicht erwarten. Die Array-API ist schrecklich.
Craig Ringer
Danke Craig. Im Idealfall versuche ich, die Jaccard-Ähnlichkeit zwischen zwei Arrays schnell zu ermitteln. Gibt es Tipps, wie Sie die smlar-Erweiterung von Teodor unter Windows kompilieren können?
Neil McGuigan
Ich kämpfe jetzt mit dem gleichen Problem. Ich habe versucht, meine Textelemente in Ganzzahlen zu konvertieren, um die Ganzzahl-Indizierungserweiterungen zu verwenden. Haben Sie jemals einen Weg gefunden, dies schnell zu tun?
Greg
Welchen Datentyp verwenden Sie? Wie groß sind die Arrays?
Evan Carroll

Antworten:

3
  1. Sie sagen, Sie suchen nach "Jaccard-Ähnlichkeit zwischen zwei Arrays"

    Sie können MadLib in Betracht ziehen, das dies als bereitstelltdist_jaccard()

    Jaccard-Abstand zwischen zwei Varchar-Vektoren, die als Sätze behandelt werden.

  2. Vielleicht möchten Sie es auch ohne versuchen STRICT. Das könnte es verlangsamen.

  3. Möglicherweise möchten Sie verwenden, INTERSECT ALLinsbesondere wenn Sie wissen, dass Sie keine Dupes haben $1.

  4. Wie Craig Ringer in den Kommentaren sagte, möchten Sie vielleicht heraus intarrayund verwenden &.

Um hier eine genauere Antwort zu geben,

  • Was sind die Datentypen?
  • Über wie viele Elemente sprechen wir in jedem Array?
  • Wie viel Ausschluss bietet das INTERSECT?
Evan Carroll
quelle