Finde Übereinstimmung über Array von RegEx in MongoDB Collection

9

Angenommen, ich habe eine Sammlung mit diesen Feldern:

%Vor%

Also meine Eingabe ist "abc", also würde ich gerne den entsprechenden Typ (oder die beste Übereinstimmung) erhalten, obwohl ich anfänglich davon ausgehe, dass RegExes exklusiv sind. Gibt es eine Möglichkeit, dies mit anständiger Leistung zu erreichen? (das würde das Iterieren über jedes Element des RegEx-Arrays ausschließen)

Bitte beachten Sie, dass das Schema nach Möglichkeit neu angeordnet werden kann, da sich dieses Projekt noch in der Entwurfsphase befindet. Alternativen wären willkommen.

Jede Kategorie kann ungefähr 100 - 150 RegExes haben. Ich plane, ungefähr 300 Kategorien zu haben. Aber ich weiß, dass Typen sich gegenseitig ausschließen.

Beispiel einer realen Welt für eine Kategorie:

%Vor%     
Dan 17.10.2014, 18:17
quelle

2 Antworten

2

Die Beschreibung der RegEx ( Dividieren und Impera ) würde erheblich dazu beitragen, die Anzahl der Dokumente, die verarbeitet werden müssen, zu begrenzen.

Einige Ideen in dieser Richtung:

  • RegEx akzeptiert die Länge (fest, min, max)
  • POSIX Stil-Zeichenklassen ( [:alpha:] , [:digit:] , [:alnum:] , usw.)
  • Struktur wie Dokumentstruktur (umm)

Das Implementieren jeder dieser Komponenten würde die Komplexität (Code- und / oder manuelle Eingabe) für die Einfügung und auch einen zusätzlichen Aufwand für die Beschreibung von searchterm vor der Abfrage erhöhen.

Sich gegenseitig ausschließende Typen in einer Kategorie zu haben, vereinfacht die Dinge, aber was ist zwischen den Kategorien?

  

300 Kategorien @ 100-150 RegExps / Kategorie = & gt; 30k bis 45k RegExps

... einige wären sicherlich genaue Duplikate, wenn nicht die meisten von ihnen.

Bei diesem Ansatz versuche ich, die Gesamtzahl der zu speichernden / abfragenden Dokumente in einem umgekehrten Stil gegenüber dem ursprünglich vorgeschlagenen "Schema" zu minimieren.
Hinweis: In dieser Demo wurden nur String-Längen für die Eingrenzung angegeben. Dies kann natürlich für manuelle Eingaben nützlich sein, da dies eine visuelle Überprüfung der RegEx ermöglichen könnte

Überarbeiten Sie die regexes Sammlung mit Dokumenten wie folgt:

%Vor%

.. jedes eindeutige RegEx als eigenes Dokument mit Kategorien, zu denen es gehört (erweiterbar auf mehrere Typen pro Kategorie)

Demo-Aggregationscode:

%Vor%

Rückgabe für 'abc' query:

%Vor%

Dies wird nur für diese beiden Dokumente gelten:

%Vor%

um die Länge 3 eingegrenzt und mit der Kategorie ONE versehen.

Könnte noch weiter eingeengt werden, indem POSIX descriptors implementiert wird (einfach gegen die searchterm zu testen, aber 2 RegExps in der Datenbank einzugeben)

    
CSᵠ 21.10.2014, 19:36
quelle
0

Breite erste Suche. Wenn Ihre Eingabe mit einem Buchstaben beginnt, können Sie Typ 1 wegwerfen, wenn sie auch eine Zahl enthält, können Sie exklusive (nur Zahlen oder nur Buchstaben) Kategorien wegwerfen, und wenn sie auch ein Symbol enthält, dann behalten Sie nur eine Handvoll Typen, die alle enthalten drei. Folgen Sie dann den obigen Hinweisen für die verbleibenden Kategorien. In gewissem Sinne richten Sie Fälle für Eingabetypen und Anwendungsfälle für eine ausgewählte Anzahl von 'Regex-Typen' ein, um nach der richtigen zu suchen.

Sie können auch ein Regex-Modell basierend auf der Eingabe erstellen und es mit der Liste der Regex-Modelle vergleichen, die als Zeichenfolge zum Abrufen des Typs vorhanden sind. Auf diese Weise müssen Sie nur Ressourcen ausgeben, die die Eingabe analysieren, um die Regex dafür zu erstellen.

    
Michael Rotakhin 21.10.2014 14:50
quelle