Команда ReQL: indexCreate
Синтаксис команды
table.indexCreate(indexName[, indexFunction]) → object
Описание
Создает новый вторичный индекс на таблице. Вторичные индексы повышают скорость многих запросов чтения, немного увеличивая занимаемое пространство и снижая производительность записи. Для получения дополнительной информации о вторичных индексах, прочтите статью «Использование вторичных индексов в RethinkDB».
RethinkDB поддерживает различные типы вторичных индексов:
- Простые индексы, основанные на значении одного поля.
- Составные индексы, основанные на нескольких полях.
-
Многомерные индексы, основанные на массивах значений, созданные, когда аргумент
multioptArg равенtrue. -
Географические индексы, основанные на индексах геометрических объектов, созданные, когда аргумент
geooptArg равенtrue. - Индексы, основанные на произвольных выражениях.
Функция indexFunction может быть анонимной функцией или двоичным представлением, полученным из поля function объекта indexStatus. Функция должна быть детерминированной, поэтому не может использовать подзапросы или команду r.js.
В случае успеха, createIndex вернет объект в формате {"created": 1}. Если индекс с таким именем уже существует в таблице, будет выброшено исключение ReqlRuntimeError.
Обратите внимание, что индекс может не быть сразу доступен после создания. Если ваше приложение нуждается в использовании индексов сразу после создания, воспользуйтесь командой indexWait, чтобы убедиться, что индексы готовы к использованию.
Пример: Создание простого индекса, основанного на поле postId.
r.table("comments").indexCreate("postId").run(conn);
Пример: Создание простого индекса, основанного на вложенном поле author > name.
r.table("comments").indexCreate("author_name", row -> row.g("author").g("name"))
.run(conn);
Пример: Создание географического индекса, основанного на поле location.
r.table("places").indexCreate("location").optArg("geo", true).run(conn);
Поле географического индекса должно содержать только геометрические объекты. Оно будет работать с геометрическими терминами ReQL (getIntersecting и getNearest), а также со специфическими для индекса терминами (indexStatus, indexWait, indexDrop и indexList). Использование терминов, которые полагаются на негеометрический порядок, таких как getAll, orderBy и between, приведет к ошибке.
Пример: Создание составного индекса, основанного на полях postId и date.
r.table("comments").indexCreate("postAndDate",
row -> r.array(row.g("postId"), row.g("date"))./transformations/slice.md
).run(conn);
Пример: Создание многомерного индекса, основанного на поле authors.
r.table("posts").indexCreate("authors").optArg("multi", true).run(conn);
Пример: Создание географического многомерного индекса, основанного на поле towers.
r.table("networks").indexCreate("towers")
.optArg("geo", true).optArg("multi", true).run(conn);
Пример: Создание индекса, основанного на произвольном выражении.
r.table("posts").indexCreate("authors", doc -> r.branch(
doc.hasFields("updatedAt"),
doc.g("updatedAt"),
doc.g("createdAt")
)).run(conn);
Пример: Создание нового вторичного индекса на основе существующего.
byte[] index = r.table("posts").indexStatus("authors").nth(0).g("function")
.run(conn, byte[].class).first();
r.table("newPosts").indexCreate("authors", index).run(conn);
Пример: Перестроение устаревшего вторичного индекса в таблице.
byte[] oldIndex = r.table("posts")
.indexStatus("oldIndex").nth(0).g("function").run(conn, byte[].class).first();
r.table("posts").indexCreate("newIndex", oldIndex).run(conn);
r.table("posts").indexWait("newIndex").run(conn);
r.table("posts").indexRename("newIndex", "oldIndex")
.optArg("overwrite", true).run(conn);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/java/index_create/