GIN or GiST Indexes
See Exploring the Postgres GIN index for more information on the GIN index strategy within Postgresql.
To optimize a wider range of ad-hoc queries against the document JSONB, you can apply a GIN index to the JSON field in the database:
var store = DocumentStore.For(options =>
{
// Add a gin index to the User document type
options.Schema.For<User>().GinIndexJsonData();
// Adds a basic btree index to the duplicated
// field for this property that also overrides
// the Postgresql database type for the column
options.Schema.For<User>().Duplicate(x => x.FirstName, pgType: "varchar(50)");
// Defining a duplicate column with not null constraint
options.Schema.For<User>().Duplicate(x => x.Department, pgType: "varchar(50)", notNull: true);
// Customize the index on the duplicated field
// for FirstName
options.Schema.For<User>().Duplicate(x => x.FirstName, configure: idx =>
{
idx.Name = "idx_special";
idx.Method = IndexMethod.hash;
});
// Customize the index on the duplicated field
// for UserName to be unique
options.Schema.For<User>().Duplicate(x => x.UserName, configure: idx =>
{
idx.IsUnique = true;
});
// Customize the index on the duplicated field
// for LastName to be in descending order
options.Schema.For<User>().Duplicate(x => x.LastName, configure: idx =>
{
idx.SortOrder = SortOrder.Desc;
});
});
Marten may be changed to make the GIN index on the data field be automatic in the future.