2016-04-04 5 views
2

私は何百万ものレコードをセットにしています。私は同じパターンに一致するすべてのレコードを取得したいと思います。例えばAerospikeの正規表現に一致するすべてのレコードを取得するには?

私が持っている可能性があります

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 

は、事前にfieldAの値を知らなくても、上記のすべてのレコードを取得するクエリを作成することが可能ですか?正規表現でこれのようなもの:

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

ありがとうございます。

+0

Aerospike Forumからこの提案をチェックしてください:https://discuss.aerospike.com/t/how-to-write-wildcard-seach-statement/385 – lvolmar

答えて

4

はい、できます。最初にセカンダリインデックスでクエリを実行し、結果セットを管理可能なサイズに絞り込み、必要のないものをフィルタリングするLuaを使用してフィルタを作成する必要があります。このフィルタは、マッチさせる(動的に渡す)正規表現を取り、一致するレコードだけを返すことができます。

これは機能しますが、Aerospikeのキーバリュー操作と同じようには機能しません。このようなソリューションを実稼働させる前にベンチマークしておくことは間違いありません。

1

Predicate filteringは、あなたがそのようなあなたが言及した一人として複雑なフィルタを構築するためのJavaクライアントのPredExpクラスのstringRegexメソッドを使用することができます3月15日にrelease 3.12に追加されました。現在、C,C#、およびGoクライアントにも存在します。

similar exampleは、エアロスパイクJavaクライアントにあります:com.aerospike.client.queryで

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

RegexFlagクラスには、使用できる正規た表現を定義し、そして彼らが振る舞うだろうか。

関連する問題