2016-04-19 9 views
3

Aerospikeで新しくなった。 Mysqlのようなテキストの一部で検索する簡単な方法はありますか?例:AerospikeのLIKEクエリ演算子を実装する

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

この一般的な操作がサポートされていない場合は、NoSQLデータベースに移行するのが困難です。おかげさまで

+2

一般的な操作は、少なくとも適切な時間内に結果を返すことを期待している場合は、RDBMSで使用しないでください。 LIKEは索引を使用できないため、表全体をスキャンする必要があります。 Aerospikeの非常に大きなセットでのスキャンは、同様のサイズのテーブルのスキャンよりもはるかに高速です。 –

+0

あなたの答えに感謝rbotzer。 それはあなたが提案する良いテクニックです。私はまだテキストを検索する必要があります。 私は単語や単語の一部を検索するアプリケーションを持っています。 私はMongoDbがこの目的にはうまく合っていて、NoSQLデータベースであると思います。 よろしくお願いいたします。 – karrtojal

答えて

2

Predicate filteringrelease 3.12に加えた。 JavaクライアントのPredExpクラスのstringRegexメソッドを使用して、LIKEに相当するメソッドを実装できます。述語フィルタは現在、C,C#およびGoクライアントにも存在します。

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

あなたはまだ述語フィルタリングをサポートしていない言語のクライアントを使用している場合は、あなたがに接続stream UDFでこれを実装したい:エアロスパイクJavaクライアントでこのexample

は似た何かを示していスキャンまたは照会。たとえば、Pythonクライアントでは、述語の有無にかかわらずクラスaerospike.Queryのインスタンスを作成し、aerospike.Query.apply()メソッドを呼び出します。

理想的には、セット全体をスキャンするのではなく、バケット処理と述語を使用して検索の絞り込みを加速します。たとえば、最初の文字を保持するstartswith binを作成し、それを見つけるために述部を使用してから、ストリームUDFで一致したレコードを送信することができます。ただ、LIKEはインデックスを使用できないため、RDBMS上ではひどく遅い操作であることにも注意してください。

関連する問題