Статьи

Индексы и селективность

Первоначально Тодд Гринштейн

Индексы в 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"}
]
}