table.index_create(index_name[, index_function][, :multi => false, :geo => false]) → object
Create a new secondary index on a table. Secondary indexes improve the speed of many read queries at the slight cost of increased storage space and decreased write performance. For more information about secondary indexes, read the article “Using secondary indexes in RethinkDB.”
RethinkDB supports different types of secondary indexes:
geo
optional argument is true.The index_function
can be an anonymous function or a binary representation obtained from the function
field of index_status. The function must be deterministic, and so cannot use a subquery or the r.js
command.
If successful, create_index
will return an object of the form {:created => 1}
. If an index by that name already exists on the table, a ReqlRuntimeError
will be thrown.
Note that an index may not be immediately available after creation. If your application needs to use indexes immediately after creation, use the index_wait command to ensure the indexes are ready before use.
Example: Create a simple index based on the field post_id
.
r.table('comments').index_create('post_id').run(conn)
Example: Create a simple index based on the nested field author > name
.
r.table('comments').index_create('author_name'){ |doc|
doc["author"]["name"]
}.run(conn)
Example: Create a geospatial index based on the field location
.
r.table('places').index_create('location', :geo => true).run(conn)
A geospatial index field should contain only geometry objects. It will work with geometry ReQL terms (get_intersecting and get_nearest) as well as index-specific terms (index_status, index_wait, index_drop and index_list). Using terms that rely on non-geometric ordering such as get_all, order_by and between will result in an error.
Example: Create a compound index based on the fields post_id
and date
.
r.table('comments').index_create('post_and_date'){ |doc|
[doc["post_id"], doc["date"]]
}.run(conn)
Example: Create a multi index based on the field authors
.
r.table('posts').index_create('authors', :multi=>true).run(conn)
Example: Create a geospatial multi index based on the field towers
.
r.table('networks').index_create('towers', :geo=>true, :multi=>true).run(conn)
Example: Create an index based on an arbitrary expression.
r.table('posts').index_create('authors'){ |doc|
r.branch(
doc.has_fields("updated_at"),
doc["updated_at"],
doc["created_at"]
)
}.run(conn)
Example: Create a new secondary index based on an existing one.
index = r.table('posts').index_status('authors').nth(0)['function'].run(conn)
r.table('new_posts').index_create('authors', index).run(conn)
Example: Rebuild an outdated secondary index on a table.
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)
Couldn't find what you were looking for?
Contribute: edit this page or open an issue