Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Как опрашивать вторичный индекс? #157

Open
catroot opened this issue Feb 3, 2018 · 6 comments
Open

Как опрашивать вторичный индекс? #157

catroot opened this issue Feb 3, 2018 · 6 comments

Comments

@catroot
Copy link

catroot commented Feb 3, 2018

Привет! Никак не пойму как опрашивать первичный индекс без вторичного...
К примеру, на питоне имеем схему:

schema = Schema(key_parts=[StringIndex('key'), StringIndex('predicate')], value_parts=[StringIndex('value'), BinaryIndex('bin')])

Как опросить первичный индекс без вторичного?
Можно ли опросить вторичный индекс без первичного?
Можно ли опросить по значению value - оно тоже ведь индексируется?
Можно ли выбрать какое значение возвращать value или bin?
Ведь если индекс нельзя опрашивать - он бесполезен.

@pmwkaa
Copy link
Owner

pmwkaa commented Feb 8, 2018

Привет. София автоматически не поддерживается вторичные индексы. Аналогичный функционал можно получить, если создавать и обновлять две (или больше) базы в одной транзакции. Есть пример в тестах: https://github.com/pmwkaa/sophia/blob/master/test/generic/secondary_index.test.c

То есть создаем две базы, одна как primary index с одним набором ключей. И secondary со своим набором ключей + ключи из primary index. В таком случае мы сами решаем, что и где хранить.

К сожалению питоновский драйвер делался не мной, сложно сходу сказать.

@catroot
Copy link
Author

catroot commented Feb 8, 2018

Так то да, этажерки можно строить произвольной вложенности.
Я просто хочу понять размер кванта в Софии. Судя по всему - это целиком key и value, неважно как я в схеме это описываю, всё равно спросить я могу только целиком key и получить полное value.
Получить ключ по значению тоже нельзя, насколько я понял?

@pmwkaa
Copy link
Owner

pmwkaa commented Feb 8, 2018

Скорее ближе к документному хранилище. Здесь нет отдельных key/value, есть именованные типизированные поля. Можно делать составные ключи по нескольким полям. Так же их можно и опрашивать частично. Получить ключ по значению, кажется это задача для вторичного индекса. Для вторичного индекса должна быть теже поля, но другие ключи + ключи primary (чтобы обеспечить уникальность).

@catroot
Copy link
Author

catroot commented Feb 8, 2018

Частично это как раз в случае если лежат в разных базах?
т.е. для комбинации ключей а, б, а+б мне нужно три базы в двух из которых будут храниться индексы из базы а?

@pmwkaa
Copy link
Owner

pmwkaa commented Feb 8, 2018

Например мы храним документы в такой схеме {name, address}. Хотим индекс по name и отдельно по address:

Для primary: {name key(0), address}.
Для Secondary: {name key(1), address key(0)}.

Здесь key() говорит, что поле будет ключем а число - порядок.

@catroot
Copy link
Author

catroot commented Feb 8, 2018

А на питоне это будет выглядеть так:

schema = Schema(key_parts=[StringIndex('key,key(0)'), StringIndex('predicate,key(1)')], value_parts=[StringIndex('value,key(2)'), BinaryIndex('bin,key(3)')])

Или в драйвере питона это не имплементировано?
key() может быть только 0 и 1 или можно 2, 3 и т.д.?

Посмотрел код.. вроде так не получится. там только имя индекса задаётся.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants