2017-02-06 3 views
1

現在、「エアロスパイク」をテスト中です。 しかし、私たちが鍵を参照して理解していない特定の点が文書にあります。Aerospikeここでクエリインデックスのpython

key = ('trivium', 'profile', 'data') 
# Write a record 
client.put(key, { 
    'name': 'John Doe', 
    'bin_data': 'KIJSA9878MGU87', 
    'public_profile': True 
}) 

一般的なドキュメントでクエリを実行しようとしたときに名前空間について読みました。

client = aerospike.client(config).connect() 
     query = client.query('trivium', 'profile') 
     query.select('name', 'bin_data') 
     query.where(p.equals('public_profile', True)) 
     print(query.results()) 

結果はnullですが、私たちは「どこで」文のクエリはすべてのレコードをもたらすeeraseとき、ドキュメントがセカンダリインデックスと、そのクエリの仕事と言うが、それがどのように機能しますか?

よろしくお願いいたします。

答えて

2

クエリで1つのフィルタを使用できます。あなたのケースでは、等価フィルタであるそのフィルタはpublic_profile binにあります。フィルタを使用するには、public_profile binにセカンダリインデックス(SI)を作成する必要がありますが、SIは数値データ型または文字列データ型を含むビンにのみ存在できます。だからあなたがやろうとしていることを実行するには、public_profileを0または1の数値エントリに変更し、そのビンにセカンダリインデックスを追加し、0または1の値に等価フィルタを使用します。任意のクエリで1つのフィルタのみを呼び出すことができます。複数のフィルターを "AND"で連結することはできません。複数のフィルターを使用する必要がある場合は、ストリームUDF(ユーザー定義関数)を記述する必要があります。あなたはSIを定義するためにAQLを使うことができます。あなたは一度だけする必要があります。

$aql 
aql>help --- see the command to add secondary index. 
aql>exit 

SIはプロセスRAMに存在します。一度定義されると、追加または変更された新しいデータは、適切な場合にはエアロスキーによって自動的に索引付けされます。 public_profileにindexをNUMERICとして定義した場合、一部のレコードではそのビンに文字列データを挿入すると、それらのレコードは索引付けされず、照会フィルターには参加しません。

+1

Aerospikeは高速ですが、ユーザ管理者には使えると思っていましたが、システムにとっては複雑なクエリのように思えます。しかし、私たちはmongoやcassandraのような別の技術を試してみます。 ありがとうございました – UlyssesMarx

+0

確かに、ユースケースに最も適したソリューションを使用してください。ところで、stream udfsはかなり簡単に書くことができます。ここに簡単な例があります。 https://discuss.aerospike.com/t/record-manipulation-with-more-than-one-filter-lua/3637ここにコードはhttps://github.com/pygupta/aerospike-discuss/tree/です。 master/topic3637 – pgupta

+1

更新されたgithubのリンク:https://github.com/pygupta/aerospike-discuss/tree/master/topic3637_streamUDF_multifilter – pgupta