2016-04-03 72 views
3

我试图在aerospike中存储地图,并根据地图的关键点获取数据。查询Aerospike中的地图的钥匙

首先,我创建了完事指数在那里我存储地图

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 

然后我用Java客户端存储地图

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

    } 

我通过APL和检查数据数据显然存在。

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 state ='而不是'where status ='? – Aaron

+0

@Aaron,我试着使用状态,它给出了一个不同的错误。相应地更新问题。 –

回答

6

除了数字,字符串和Geo2DSphere类型之外,Aerospike支持MapKeys,MapValues,Lists上的二级索引。

对于您的情况,您可以按照以下方式在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的。


原始响应

查询通过在地图上的键,图值,或列表值次要索引是 not officially supported yet

也就是说,功能和语法有些可用。您需要:

  1. MAPKEYS类型,MAPVALUESLIST(你使用类型STRING此刻)

  2. Select如下(你缺少的部分IN MAPKEYS)创建辅助索引:

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

如果在AQL控制台中键入help,则查询语法以及其他一些位可用。