Первоначально Тодд Гринштейн
Индексы в Couchbase
Индексы в Couchbase являются гибким средством выполнения серверной обработки. При использовании индексов можно создавать агрегации типов дерева решений и функции избирательности, например, такие как в системе управления запасами. Используя четко определенную и гибкую модель данных в сочетании с подсистемой индексирования Couchbase, можно создавать приложения с высокой степенью избирательности. Couchbase предоставляет возможность передавать параметры для динамического запроса. Краткий обзор доступных параметров выглядит следующим образом:
- Key = «»
- Ключи = []
- StartKey / EndKey = «»
- startkey_docID / endkey_docID = «»
- несвежий = [ложь, update_after, верно]
- группа / group_by
- include_docs = [истинно]
Селективность здания
В следующем примере система управления запасами будет использоваться для демонстрации силы селективности индексов в Couchbase. Пример для магазина одежды, который должен иметь возможность выполнять запросы с селективностью для:
- по категориям товаров
- по поставщику товара
- скидкой
Формат JSON для предметов, хранящихся в корзине инвентаря, упрощен для этого примера и использует небольшой набор тестовых данных из семи документов. Пример документа выглядит следующим образом:
{ "item": "KS-00114629 Dark Grey Glasses", "vendor": "kate spade", "category": "glasses" }
С помощью этого сегмента мы можем построить индекс под названием «каталог» следующим образом:
function(doc,meta){ if(doc.item){ if(doc.vendor){ emit(doc.vendor, doc.item); } if(doc.category){ emit(doc.category, doc.item); } if(doc.discount){ emit(doc.discount,doc.item); } } }
Этот индекс выполняет некоторые интересные функциональные возможности, которые учитывают избирательность в запросах. Рабочий процесс для этого индекса выглядит следующим образом:
- if (doc.item) { // Проверяет, есть ли в документе поле с именем «item»
- if (doc.vendor) { // Проверяет, есть ли в документе поле с именем vendor, и если оно имеет имя поставщика в качестве ключа, и поле элемента в качестве значения
- if (doc.category) { // Проверяет, есть ли в документе поле с именем category, и если оно действительно выдает имя категории в качестве ключа, а поле элемента в качестве значения
- if (doc.discount) { // Проверяет, есть ли в документе поле с именем скидка, и если оно имеет значение скидки, в качестве ключа, и поле элемента в качестве значения
Этот индекс может потенциально выдавать три строки в пределах для каждого документа, предполагая, что документ имеет поставщика, категорию и скидку.
После развертывания этот индекс вызывается из любой конечной точки кластера (для этого примера используется узел кластера с ip 192.168.60.101) с:
http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0
16 строк возвращаются:
{"total_rows":16,"rows":[ {"id":"0000000007","key":"10","value":"CH-44308670 Two Tone Yellow Kremlin Bag"}, {"id":"0000000006","key":"15","value":"IH-00884501 Triple ring Shoulder bag"}, {"id":"0000000007","key":"Chrome","value":"CH-44308670 Two Tone Yellow Kremlin Bag"}, {"id":"0000000001","key":"glasses","value":"KS-00114629 Dark Grey Glasses"}, {"id":"0000000003","key":"glasses","value":"RL-00657038 Blue Rodeo Sunglasses"}, {"id":"0000000002","key":"handbag","value":"KS-00113108 Blue Shoulder Strap Handbag"}, {"id":"0000000004","key":"handbag","value":"RL-00332567 Yellow Messenger Bag"}, {"id":"0000000006","key":"handbag","value":"IH-00884501 Triple ring Shoulder bag"}, {"id":"0000000007","key":"handbag","value":"CH-44308670 Two Tone Yellow Kremlin Bag"}, {"id":"0000000005","key":"iron heart","value":"IH-00130628 Slim Cut Denim"}, {"id":"0000000006","key":"iron heart","value":"IH-00884501 Triple ring Shoulder bag"}, {"id":"0000000001","key":"kate spade","value":"KS-00114629 Dark Grey Glasses"}, {"id":"0000000002","key":"kate spade","value":"KS-00113108 Blue Shoulder Strap Handbag"}, {"id":"0000000005","key":"pants","value":"IH-00130628 Slim Cut Denim"}, {"id":"0000000003","key":"ralph lauren","value":"RL-00657038 Blue Rodeo Sunglasses"}, {"id":"0000000004","key":"ralph lauren","value":"RL-00332567 Yellow Messenger Bag"} ] }
Избирательность в запросе
Благодаря гибкости, определенной в модели данных и развернутой в индексе, этот индекс можно использовать для выполнения запросов к базе данных с высокой степенью селективности. Запрос Range может использоваться для выбора всех товаров от конкретного поставщика. Например, чтобы увидеть все предметы в корзине от Кейт Спейд, начальную и конечную клавиши «Кейт Спейд» можно передать следующим образом:
http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22
Несмотря на то, что индекс содержит 16 строк, только два будут возвращены клиентскому приложению:
{"total_rows":16,"rows":[ {"id":"0000000001","key":"kate spade","value":"KS-00114629 Dark Grey Glasses"}, {"id":"0000000002","key":"kate spade","value":"KS-00113108 Blue Shoulder Strap Handbag"} ] }
На этом этапе также существует возможность вернуть весь документ с этим запросом, а не только элементы, выбрасываемые в индекс. Если этот же запрос выполняется снова, с параметром «include_docs», установленным в «true», выполните следующее:
http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22&include_docs=true
Возвращаются те же два идентификатора, на этот раз со всем документом для каждой строки в индексе, который соответствует диапазону:
{"total_rows":16,"rows":[ {"id":"0000000001","key":"kate spade","value":"KS-00114629 Dark Grey Glasses","doc":{"meta":{"id":"0000000001","rev":"6-00002ec467e06f2a0000000000000000","expiration":0,"flags":0},"json":{"item":"KS-00114629 Dark Grey Glasses","vendor":"kate spade","category":"glasses"}}}, {"id":"0000000002","key":"kate spade","value":"KS-00113108 Blue Shoulder Strap Handbag","doc":{"meta":{"id":"0000000002","rev":"6-00002ec9a2088ad70000000000000000","expiration":0,"flags":0},"json":{"item":"KS-00113108 Blue Shoulder Strap Handbag","vendor":"kate spade","category":"handbag"}}} ] }
Возможности этой модели данных могут быть объяснены далее при выполнении запроса для просмотра товаров, с которыми в настоящее время связана скидка. Запрос может быть выполнен с конечным ключом «a» из-за порядка сортировки в юникоде, который использует Couchbase, и будут возвращены все числовые значения ключей:
http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&endkey=%22a%22
Возвращаются две строки в индексе, которые были отправлены из-за наличия скидки в документе для элемента.
{"total_rows":16,"rows":[ {"id":"0000000007","key":"10","value":"CH-44308670 Two Tone Yellow Kremlin Bag"}, {"id":"0000000006","key":"15","value":"IH-00884501 Triple ring Shoulder bag"} ] }