2016-04-04 5 views
2

Ich habe Millionen von Datensätzen in einem Satz. Ich möchte alle Datensätze abrufen, die demselben Muster entsprechen.Wie erhalten Sie alle Datensätze, die mit einem Regex in Aerospike übereinstimmen?

Zum Beispiel kann ich:

id=4444?mode=mode1?fieldA=abc 
id=4444?mode=mode1?fieldA=azerty 
id=4444?mode=mode1?fieldA=qwerty 
id=4444?mode=mode1?fieldA=foo 
id=4444?mode=mode1?fieldA=bar 

Ist es möglich, eine Abfrage zu machen alle oben genannten Aufzeichnungen, ohne den Wert des fieldA im Voraus zu wissen, zu bekommen? So etwas in Regex:

id=4444?mode=mode1?fieldA=[\w]* 

Vielen Dank für Ihre Zeit.

+0

überprüfen Sie diesen Vorschlag aus dem Aerospike Forum: https://discuss.aerospike.com/t/how-to-write-wildcard-seach-statement/385 – lvolmar

Antwort

4

Ja, es kann getan werden. Sie müssten zuerst nach einem sekundären Index suchen, um die Ergebnismenge zuerst auf eine verwaltbare Größe zu beschränken, und dann einen Filter mit Lua schreiben, der diejenigen ausfiltert, die Sie nicht möchten. Dieser Filter könnte die Regex übernehmen, mit der Sie übereinstimmen möchten (dynamisch übergeben) und nur die übereinstimmenden Datensätze zurückgeben.

Während dies funktionieren würde, wäre es nicht so leistungsfähig wie die Schlüssel-Wert-Operationen in Aerospike. Sie möchten definitiv eine solche Lösung benchmarken, bevor Sie sie in Produktion bringen.

1

Predicate filtering wurde in release 3.12 am 15. März hinzugefügt Sie die stringRegex Methode der PredExp Klasse des Java-Client verwenden, können komplexe Filter, wie die, die Sie erwähnt zu bauen. Es existiert derzeit auch für die C, C# und Go Clients.

Es gibt eine similar example in der Aerospike-Java-Client:

Statement stmt = new Statement(); 
    stmt.setNamespace(params.namespace); 
    stmt.setSetName(params.set);   
    stmt.setFilter(Filter.range(binName, begin, end)); 
    stmt.setPredExp(
     PredExp.stringBin("bin3"), 
     PredExp.stringValue("prefix.*suffix"), 
     PredExp.stringRegex(RegexFlag.ICASE | RegexFlag.NEWLINE) 
     ); 

Die RegexFlag Klasse in com.aerospike.client.query definiert, welche regulären Ausdrücken Sie verwenden können, und wie würden sie sich verhalten.