Spec-Zone.ru › RethinkDB ruby

Команда ReQL: index_create

Синтаксис команды

table.index_create(index_name[, index_function][, :multi => false, :geo => false]) → object

Описание

Создайте новый вторичный индекс в таблице. Вторичные индексы повышают скорость многих запросов на чтение с небольшой потерей пространства хранения и снижением производительности записи. Для получения дополнительной информации о вторичных индексах ознакомьтесь со статьей «Использование вторичных индексов в RethinkDB».

RethinkDB поддерживает различные типы вторичных индексов:

  • Простые индексы, основанные на значении одного поля.
  • Составные индексы, основанные на нескольких полях.
  • Многоуровневые индексы, основанные на массивах значений.
  • Геопространственные индексы, основанные на индексах геометрических объектов, создаваемых, когда geo необязательный аргумент имеет значение true.
  • Индексы, основанные на произвольных выражениях.

index_function может быть анонимной функцией или двоичным представлением, полученным из function поля index_status. Функция должна быть детерминированной и поэтому не может использовать подзапрос или команду r.js.

В случае успеха create_index вернёт объект следующего вида {:created => 1}. Если индекс с таким именем уже существует в таблице, будет выброшено исключение ReqlRuntimeError.

Обратите внимание, что индекс может быть недоступен сразу после создания. Если вашему приложению необходимо использовать индексы немедленно после создания, воспользуйтесь командой index_wait, чтобы убедиться, что индексы готовы к использованию.

Пример: Создание простого индекса, основанного на поле post_id.

r.table('comments').index_create('post_id').run(conn)

Пример: Создание простого индекса, основанного на вложенном поле author > name.

r.table('comments').index_create('author_name'){ |doc|
    doc["author"]["name"]
}.run(conn)

Пример: Создание геопространственного индекса, основанного на поле location.

r.table('places').index_create('location', :geo => true).run(conn)

Поле геопространственного индекса должно содержать только геометрические объекты. Оно будет работать с геометрическими терминами ReQL (get_intersecting и get_nearest), а также со специфичными для индекса терминами (index_status, index_wait, index_drop и index_list). Использование терминов, основанных на негеометрическом порядке, таких как get_all, order_by и between, приведёт к ошибке.

Пример: Создание составного индекса, основанного на полях post_id и date.

r.table('comments').index_create('post_and_date'){ |doc|
    [doc["post_id"], doc["date"]]
}.run(conn)

Пример: Создание многоуровневого индекса, основанного на поле authors.

r.table('posts').index_create('authors', :multi=>true).run(conn)

Пример: Создание геопространственного многоуровневого индекса, основанного на поле towers.

r.table('networks').index_create('towers', :geo=>true, :multi=>true).run(conn)

Пример: Создание индекса, основанного на произвольном выражении.

r.table('posts').index_create('authors'){ |doc|
    r.branch(
        doc.has_fields("updated_at"),
        doc["updated_at"],
        doc["created_at"]
    )
}.run(conn)

Пример: Создание нового вторичного индекса, основанного на существующем.

index = r.table('posts').index_status('authors').nth(0)['function'].run(conn)
r.table('new_posts').index_create('authors', index).run(conn)

Пример: Перестройка устаревшего вторичного индекса в таблице.

old_index = r.table('posts').index_status('old_index').nth(0)['function'].run(conn)
r.table('posts').index_create('new_index', old_index).run(conn)
r.table('posts').index_wait('new_index').run(conn)
r.table('posts').index_rename('new_index', 'old_index', {:overwrite => true}).run(conn)

Связанные команды

  • index_wait
  • index_status
  • index_list
  • index_drop

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/index_create/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API