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

Результат нулевой, но когда мы стираем оператор «где», запрос выводит все записи, в документации сказано, что запрос работает с вторичным индексом, но как это работает?

С уважением.


person Ulises    schedule 06.02.2017    source источник


Ответы (1)


В запросе можно использовать один фильтр. Этот фильтр, в вашем случае фильтр равенства, находится в корзине public_profile. Чтобы использовать фильтр, вы должны создать вторичный индекс (SI) для бина public_profile, однако SI могут быть только для бинов, содержащих числовой или строковый тип данных. Итак, чтобы сделать то, что вы пытаетесь сделать, измените public_profile на числовую запись, скажем, 0 или 1, затем добавьте вторичный индекс в эту корзину и используйте фильтр равенства для значения 0 или 1. Хотя вы можете создать несколько SI, вы может вызывать только один фильтр в любом заданном запросе. Вы не можете связать несколько фильтров с помощью «И». Если вам нужно использовать несколько фильтров, вам придется написать Stream UDF (определяемые пользователем функции). Вы можете использовать AQL для определения SI, достаточно сделать это один раз.

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

SI находятся в оперативной памяти процесса. После определения любые новые данные, добавленные или измененные, автоматически индексируются aerospike в зависимости от обстоятельств. Если вы определяете индекс в public_profile как NUMERIC, но в некоторые записи вставляете строковые данные в этот бин, эти записи не будут индексироваться и не будут участвовать в фильтре запроса.

person pgupta    schedule 06.02.2017
comment
Спасибо за полный ответ, вы правы, я понял, что Aerospike быстр, мы думали, что можем использовать его для администратора пользователей, но похоже, что сложный запрос важен для системы. Однако мы попробуем другую технологию, такую ​​​​как монго или кассандра. Большое спасибо, с уважением - person Ulises; 06.02.2017
comment
Конечно, вы должны использовать решение, которое лучше всего подходит для вашего случая использования. Кстати, потоковые udf довольно легко написать. Вот быстрый пример. discuss.aerospike.com/t/ и код здесь: github.com/pygupta/aerospike-discuss /дерево/мастер/тема3637 - person pgupta; 07.02.2017
comment
Обновлена ​​ссылка на github: github.com/pygupta/aerospike-discuss/tree/master/ - person pgupta; 07.02.2017