Команда 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)
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/index_create/