Index name inference

edit

Many endpoints within the Elasticsearch API expect to receive one or more index names as part of the request, in order to know what index/indices a request should operate on.

NEST has a number of ways in which the index name(s) can be specified

Default Index name on Connection Settings

edit

A default index name can be specified on ConnectionSettings using .DefaultIndex(). This is the default index name to use, when no other index name can be resolved for a request

var settings = new ConnectionSettings()
    .DefaultIndex("defaultindex"); 

var client = new ElasticClient(settings);
var searchResponse = client.Search<Project>();

set the default index

will send a search request to the API endpoint

"http://localhost:9200/defaultindex/project/_search"

Index name for a .NET type

edit

An index name can be mapped for a Plain Old CLR Object (POCO) using .DefaultMappingFor<T>() on ConnectionSettings

var settings = new ConnectionSettings()
    .DefaultMappingFor<Project>(m => m
        .IndexName("projects")
    );

var client = new ElasticClient(settings);
var searchResponse = client.Search<Project>();

will send a search request to the API endpoint

"http://localhost:9200/projects/project/_search"

.DefaultMappingFor<T>() can also be used to specify other defaults for a POCO, including property names, property to use for the document id, amongst others.

An index name for a POCO provided using .DefaultMappingFor<T>() will take precedence over the default index name set on ConnectionSettings. This way, the client can be configured with a default index to use if no index is specified, and a specific index to use for different POCO types.

var settings = new ConnectionSettings()
    .DefaultIndex("defaultindex") 
    .DefaultMappingFor<Project>(m => m
        .IndexName("projects") 
    );

var client = new ElasticClient(settings);

var projectSearchResponse = client.Search<Project>();

a default index to use, when no other index can be inferred

a index to use when Project is the target POCO type

will send a search request to the API endpoint

"http://localhost:9200/projects/project/_search"

but

var objectSearchResponse = client.Search<object>();

will send a search request to the API endpoint

"http://localhost:9200/defaultindex/object/_search"

Explicitly specifying Index name on the request

edit

For API calls that expect an index name, an index name can be explicitly provided on the request

var settings = new ConnectionSettings();
var client = new ElasticClient(settings);

var response = client.Search<Project>(s => s
    .Index("some-other-index") 
);

Provide the index name on the request

will send a search request to the API endpoint

"http://localhost:9200/some-other-index/project/_search"

When an index name is provided on a request, it will take precedence over the default index name specified on ConnectionSettings, and any index name specified for the POCO using .DefaultMappingFor<T>(). The following example will send a search request to the same API endpoint as the previous example

var settings = new ConnectionSettings()
    .DefaultIndex("defaultindex")
    .DefaultMappingFor<Project>(m => m
        .IndexName("projects")
    );

var client = new ElasticClient(settings);

var response = client.Search<Project>(s => s
    .Index("some-other-index")
);

In summary, the order of precedence for determining the index name for a request is

  1. Index name specified on the request
  2. Index name specified for the generic type parameter in the request using .DefaultMappingFor<T>()
  3. Default index name specified on ConnectionSettings

If no index can be determined for a request that requires an index, the client will throw an exception to indicate that this is the case.