Indices pathsedit
Some APIs in Elasticsearch take one or many index name or a special _all
marker to send the request to all the indices
In NEST, this is encoded using Indices
.
Implicit Conversionedit
Several types implicitly convert to Indices
Nest.Indices singleIndexFromString = "name"; Nest.Indices multipleIndicesFromString = "name1, name2"; Nest.Indices multipleIndicesFromStringArray = new [] { "name1", "name2" }; Nest.Indices allFromString = "_all"; Nest.Indices allWithOthersFromString = "_all, name2"; 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") );
Using Nest.Indicesedit
To ease creating IndexName
or Indices
from expressions, there is a static Nest.Indices
class you can use
Specifying a single indexedit
A single index can be specified using a CLR type or a string
var client = TestClient.Default; var singleString = Index("name1");var singleTyped = Index<Project>();
ISearchRequest singleStringRequest = new SearchDescriptor<Project>().Index(singleString); ISearchRequest singleTypedRequest = new SearchDescriptor<Project>().Index(singleTyped); ((IUrlParameter)singleStringRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("name1"); ((IUrlParameter)singleTypedRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("project"); var invalidSingleString = Index("name1, name2");
Specifying multiple indicesedit
Similarly to a single index, multiple indices can be specified using multiple CLR types and multiple strings
var manyStrings = Index("name1", "name2");var manyTypes = Index<Project>().And<Developer>();
var client = TestClient.Default; ISearchRequest manyStringRequest = new SearchDescriptor<Project>().Index(manyStrings); ISearchRequest manyTypedRequest = new SearchDescriptor<Project>().Index(manyTypes); ((IUrlParameter)manyStringRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("name1,name2"); ((IUrlParameter)manyTypedRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("project,devs");
manyStringRequest = new SearchDescriptor<Project>().Index(new[] { "name1", "name2" }); ((IUrlParameter)manyStringRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("name1,name2"); manyStringRequest = new SearchDescriptor<Project>().Type(new[] { "name1", "name2" }); ((IUrlParameter)manyStringRequest.Type).GetString(this.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 |
Specifying All Indicesedit
Elasticsearch allows searching across multiple indices using the special _all
marker.
NEST exposes _all
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, All
becomes ambiguous between Indices.All
and Types.All
, so the
_all
marker is exposed as Indices.AllIndices
to alleviate this ambiguity
var indicesAll = All; var allIndices = AllIndices; var client = TestClient.Default; ISearchRequest indicesAllRequest = new SearchDescriptor<Project>().Index(indicesAll); ISearchRequest allIndicesRequest = new SearchDescriptor<Project>().Index(allIndices); ((IUrlParameter)indicesAllRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("_all"); ((IUrlParameter)allIndicesRequest.Index).GetString(this.Client.ConnectionSettings).Should().Be("_all");