2016-04-03 4 views
3

Я пытаюсь сохранить карту в аэрокосмическом пространстве и получить данные на основе ключа карты.Запрос на ключ карты в 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

Вторичные индексы на MapKeys, MapValues, списки поддерживаются Aerospike, кроме типов Numeric, String и Geo2DSphere.

Для вашего сценария вы можете запросить Mapkey следующим образом.

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

Это должно вернуть результаты.

В ДУК, если вы печатаете помощь, вы должны получить следующую информацию по запросам

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

Update:

По Aerospike 3.8.1 Secondary Index on List and Map are officially supported.


Оригинальный ответ:

запросов вторичным индексом на карте ключей, значений карт, или список значений являются not officially supported yet.

При этом функциональность и синтаксис несколько доступны. Вам нужно:

  1. Создайте вторичный индекс с типом MAPKEYS, MAPVALUES или LIST (вы используете тип STRING в данный момент)

  2. Select следующим образом (вы пропустили IN MAPKEYS часть) :

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

Синтаксис запроса, а также некоторые другие биты доступны, если вы набираете help, находясь на консоли AQL.

Смежные вопросы