Попробуйте hazelcast , это сетка данных в памяти, которая распределяет данные по серверам.Вы можете иметь индексы, как вы описали в своем вопросе, и запрашивать их.
Использование очень просто.Просто добавьте Hazelcast.jar и начните кодировать.Он может быть как встроенным, так и удаленным.
Вот индекс и использование запроса
добавить индекс
IMap<Integer, Student> myDistributedMap = Hazelcast.getMap("students")
myDistributedMap.addIndex("group", false);
myDistributedMap.addIndex("sex", false);
сохранить в imdg
myDistributedMap.put(student.id, student)
;
Collection<Student> result = myDistributedMap.values(new SqlPredicate("sex=male AND group=ABC"));
Наконец-то все отлично работает в облаке.Пример: EC2