2016-04-19 34 views
3

Ich bin neu mit Aerospike. Gibt es eine einfache Möglichkeit, mit einem Teil des Textes wie Mysql zu suchen? Beispiel:Implementieren Sie einen LIKE Abfrageoperator für Aerospike

select * from test where column like '%hello%'; 

finde ich schwer zu einer NoSQL-Datenbank zu migrieren, wenn diese gemeinsamen Operationen nicht unterstützt werden. Danke.

+2

Diese allgemeine Operation sollte auch in einem RDBMS nicht verwendet werden, zumindest wenn Sie erwarten, dass Sie innerhalb einer angemessenen Zeit ein Ergebnis erhalten. LIKE kann keinen Index verwenden, daher muss die gesamte Tabelle gescannt werden. Scans auf einem sehr großen Set in Aerospike werden viel schneller sein als ein Scan eines ähnlich großen Tisches. –

+0

Danke rboter für deine Antwort. Es ist eine gute Technik, was Sie vorschlagen. Obwohl ich immer noch nach Text suchen muss. Ich habe eine Anwendung, die nach Wörtern oder Teilen von Wörtern suchen. Ich denke, dass ein MongoDb besser für diesen Zweck und immer noch eine NoSQL-Datenbank ist. Mit freundlichen Grüßen. – karrtojal

Antwort

2

Predicate filtering wurde in release 3.12 hinzugefügt. Sie können die stringRegex-Methode der Klasse PredExp des Java-Clients verwenden, um ein Äquivalent zu LIKE zu implementieren. Prädikatfilter gibt es derzeit auch für die C, C# und Go Clients.

Diese example in der Aerospike-Java-Client zeigt etwas ähnliches:

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) 
     ); 

Wenn Sie eine Sprache-Client verwenden, das noch nicht Prädikat Filterung unterstützen, würden Sie diese implementieren mit einem stream UDF zu einem befestigten scannen oder abfragen. Im Python-Client würden Sie beispielsweise eine Instanz der Klasse aerospike.Query mit oder ohne Prädikat erstellen und die Methode aerospike.Query.apply() aufrufen.

Im Idealfall würden Sie dies beschleunigen, indem Sie ein Bucket verwenden und ein Prädikat verwenden, um Ihre Suche einzugrenzen, anstatt den gesamten Satz zu scannen. Sie können beispielsweise eine Startswith-Bin erstellen, die den ersten Buchstaben enthält, das Prädikat verwenden, um das zu finden, und dann die Datensätze senden, die über die Stream-UDF abgeglichen wurden. Beachten Sie jedoch, dass ein LIKE auch für ein RDBMS eine entsetzlich langsame Operation ist, da es keinen Index verwenden kann.