Indices paths

edit

Some APIs in Elasticsearch take an index name, a collection of index names, or the special _all marker (used to specify all indices), in the URI path of the request, to specify the indices that the request should execute against.

In NEST, these index names can be specified using the Indices type.

Implicit Conversion

edit

To make working with Indices easier, several types implicitly convert to it:

Here are some examples of how implicit conversions can be used to specify index names

Nest.Indices singleIndexFromString = "name";
Nest.Indices multipleIndicesFromString = "name1, name2";
Nest.Indices multipleIndicesFromStringArray = new [] { "name1", "name2" };
Nest.Indices allFromString = "_all";

Nest.Indices allWithOthersFromString = "_all, name2"; 

Nest.Indices singleIndexFromType = typeof(Project); 

Nest.Indices singleIndexFromIndexName = IndexName.From<Project>();

singleIndexFromString.Match(
    all => all.Should().BeNull(),
    many => many.Indices.Should().HaveCount(1).And.Contain("name")
);

multipleIndicesFromString.Match(
    all => all.Should().BeNull(),
    many => many.Indices.Should().HaveCount(2).And.Contain("name2")
);

allFromString.Match(
    all => all.Should().NotBeNull(),
    many => many.Indices.Should().BeNull()
);

allWithOthersFromString.Match(
    all => all.Should().NotBeNull(),
    many => many.Indices.Should().BeNull()
);

multipleIndicesFromStringArray.Match(
    all => all.Should().BeNull(),
    many => many.Indices.Should().HaveCount(2).And.Contain("name2")
);

singleIndexFromType.Match(
    all => all.Should().BeNull(),
    many => many.Indices.Should().HaveCount(1).And.Contain(typeof(Project))
);

singleIndexFromIndexName.Match(
    all => all.Should().BeNull(),
    many => many.Indices.Should().HaveCount(1).And.Contain(typeof(Project))
);

_all will override any specific index names here

The Project type has been mapped to a specific index name using .InferMappingFor<Project>

Using Nest.Indices methods

edit

To make creating IndexName or Indices instances easier, Nest.Indices also contains several static methods that can be used to construct them.

Single index

edit

A single index can be specified using a CLR type or a string, and the .Index() method.

This example uses the static import using static Nest.Indices; in the using directives to shorthand Nest.Indices.Index() to simply Index(). Be sure to include this static import if copying any of these examples.

var singleString = Nest.Indices.Index("name1"); 
var singleTyped = Nest.Indices.Index<Project>(); 

ISearchRequest singleStringRequest = new SearchDescriptor<Project>().Index(singleString);
ISearchRequest singleTypedRequest = new SearchDescriptor<Project>().Index(singleTyped);

((IUrlParameter)singleStringRequest.Index).GetString(client.ConnectionSettings).Should().Be("name1");
((IUrlParameter)singleTypedRequest.Index).GetString(client.ConnectionSettings).Should().Be("project");

var invalidSingleString = Nest.Indices.Index("name1, name2"); 

specifying a single index using a string

specifying a single index using a type

an invalid single index name

Multiple indices

edit

Similarly to a single index, multiple indices can be specified using multiple CLR types or multiple strings

var manyStrings = Nest.Indices.Index("name1", "name2"); 
var manyTypes = Nest.Indices.Index<Project>().And<Developer>(); 

ISearchRequest manyStringRequest = new SearchDescriptor<Project>().Index(manyStrings);
ISearchRequest manyTypedRequest = new SearchDescriptor<Project>().Index(manyTypes);

((IUrlParameter)manyStringRequest.Index).GetString(client.ConnectionSettings).Should().Be("name1,name2");
((IUrlParameter)manyTypedRequest.Index).GetString(client.ConnectionSettings).Should().Be("project,devs"); 

manyStringRequest = new SearchDescriptor<Project>().Index(new[] { "name1", "name2" });
((IUrlParameter)manyStringRequest.Index).GetString(client.ConnectionSettings).Should().Be("name1,name2");

manyStringRequest = new SearchDescriptor<Project>().Type(new[] { "name1", "name2" });
((IUrlParameter)manyStringRequest.Type).GetString(client.ConnectionSettings).Should().Be("name1,name2");

specifying multiple indices using strings

specifying multiple indices using types

The index names here come from the Connection Settings passed to TestClient. See the documentation on Index Name Inference for more details.

All Indices

edit

Elasticsearch allows searching across multiple indices using the special _all marker.

NEST exposes the _all marker with Indices.All and Indices.AllIndices. Why expose it in two ways, you ask? Well, you may be using both Nest.Indices and Nest.Types in the same file and you may also be using C#6 static imports too; in this scenario, the All property becomes ambiguous between Indices.All and Types.All, so the _all marker for indices is exposed as Indices.AllIndices, to alleviate this ambiguity

var indicesAll = Nest.Indices.All;
var allIndices = Nest.Indices.AllIndices;

ISearchRequest indicesAllRequest = new SearchDescriptor<Project>().Index(indicesAll);
ISearchRequest allIndicesRequest = new SearchDescriptor<Project>().Index(allIndices);

((IUrlParameter)indicesAllRequest.Index).GetString(client.ConnectionSettings).Should().Be("_all");
((IUrlParameter)allIndicesRequest.Index).GetString(client.ConnectionSettings).Should().Be("_all");