2016-04-03 6 views
3

私は地図をaerospikeに保存しようとしており、マップのキーに基づいてデータを取得しようとしています。Aerospikeで地図のキーを照会

まず、私はその後、私はマップ

AerospikeClient client = new AerospikeClient("127.0.0.1",3000); 

    WritePolicy writePolicy = new WritePolicy(); 
    writePolicy.timeout=500; 

    for(int i = 1;i<10;i++){ 
     Key key = new Key("test","myset",""+i); 
     client.delete(writePolicy, key); 

     HashMap<String,String> map = new HashMap<String,String>(); 
     map.put("key1", "string1"); 
     map.put("key2", "string2"); 
     map.put("key3", "string3"); 

     Bin bin = new Bin("state", map); 
     client.put(writePolicy, key, bin); 

    } 

を保存するためにJavaクライアントを使用し、私はAPLを介してデータをチェックし、私はマップに

aql> create mapkeys index status on test.myset (state) String 
aql> show indexes 
+--------+---------+-----------+---------+-------+-----------+---------+------------+----------+ 
| ns  | bin  | indextype | set  | state | indexname | path | sync_state | type  | 
+--------+---------+-----------+---------+-------+-----------+---------+------------+----------+ 
| "test" | "state" | "MAPKEYS" | "myset" | "RW" | "status" | "state" | "synced" | "STRING" | 
+--------+---------+-----------+---------+-------+-----------+---------+------------+----------+ 
1 row in set (0.000 secs) 
OK 

を格納していビンにインデックスを作成しましたデータは明らかに存在する。

aql> select * from test.myset 
+--------------------------------------------------------+ 
| state             | 
+--------------------------------------------------------+ 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
| {"key1":"string1", "key2":"string2", "key3":"string3"} | 
+--------------------------------------------------------+ 
10 rows in set (0.019 secs) 

私はインデックスに基づいてクエリを実行しようとすることが

aql> select * from test.myset where status = 'key1' 
0 rows in set (0.000 secs) 
Error: (204) AEROSPIKE_ERR_INDEX 

aql> select * from test.myset where state = 'key1' 
0 rows in set (0.000 secs) 
Error: (201) AEROSPIKE_ERR_INDEX_NOT_FOUND 

誰かがこれで私を助けることができますを与える作成しました。私はそのエラーを検索しましたが、情報は見つかりませんでした。ありがとうございました。

+0

もっと深く掘り下げる前に、 'where = ='ではなく 'where state ='をすることを意味しましたか? – Aaron

+0

@Aaron、私は状態を使ってみましたが、別のエラーが出ています。それに応じて質問を更新する。 –

答えて

6

MapKeys、MapValues、Listのセカンダリインデックスは、数値型、文字列型、Geo2DSphere型を除いて、Aerospikeでサポートされています。

あなたのシナリオでは、次のようにMapkeyでクエリできます。

select * from test.myset in mapkeys where state='key1' 

結果が返されます。 AQLで

、あなたが助けを入力した場合、あなたはクエリ同様

SELECT <bins> FROM <ns>[.<set>] 
    SELECT <bins> FROM <ns>[.<set>] WHERE <bin> = <value> 
    SELECT <bins> FROM <ns>[.<set>] WHERE <bin> BETWEEN <lower> AND <upper> 
    SELECT <bins> FROM <ns>[.<set>] WHERE PK = <key> 
    SELECT <bins> FROM <ns>[.<set>] IN <indextype> WHERE <bin> = <value> 
    SELECT <bins> FROM <ns>[.<set>] IN <indextype> WHERE <bin> BETWEEN <lower> AND <upper> 

ために、次を取得する必要があり、あなたにもMapValueのためのクエリを実行することができます。

4

更新:エアロスパイク3.8.1、Secondary Index on List and Map are officially supportedのよう


元の応答:マップキー、マップ値、またはリスト値の2次索引によって

クエリは not officially supported yetです。

つまり、機能と構文は多少利用可能です。以下を行う必要があります。次のように

  1. は(あなたがIN MAPKEYS一部が欠落している)(あなたは、現時点ではタイプSTRINGを使用している)MAPVALUESまたはLIST

  2. SelectをタイプMAPKEYSとセカンダリインデックスを作成します。 :

    SELECT * FROM namespace.setname IN MAPKEYS WHERE bin = 'keyValue'

AQLコンソールでhelpと入力した場合、クエリの構文とその他のビットが利用できます。

関連する問題