Multi Getedit
You can use GetMany<T> to retrieve multiple documents of a single type by simply passing a collection containing their ids:
var ids = new [] { 1, 2, 3 };
var results = client.MultiGet(m => m.GetMany<ElasticsearchProject>(ids));Index and type are inferred, but overloads still exists for full control:
var results = client.MultiGet<ElasticsearchProject>("myalternateindex", "elasticprojs", ids);If you need to retrieve multiple documents of different types, NEST also has you covered:
var results = client.MultiGet(m => m
.Get<ElasticsearchProject>(g => g.Id(1))
.Get<Person>(g => g.Id(100))
.Get<Person>(g => g.Id(105))
);This will get 1 ElasticsearchProject document and 2 Person documents in a single request.
The above could have also been written using a combination of Get<T> and GetMany<T>:
var results = client.MultiGet(m => m
.Get<ElasticsearchProject>(g => g.Id(1))
.GetMany<Person>(new [] { 100, 105 })
);Handling the Multi Get Responseedit
MultiGet in NEST returns an IMultiGetResonse object which, similar to the request, also exposes a Get<T> and GetMany<T>
that can be used for retrieving the documents.
You can pull the single ElasticsearchProject out of the response by using Get<T>:
var hit = results.Get<ElasticsearchProject>(1);
And since we specified multiple Person documents in the above request, you can pull them all out of the response using GetMany<T>:
var hits = results.GetMany<Person>(new[] { 100, 105 });The result of Get<T> and GetMany<T> on the response object is an IMultiGetHit<T> and IEnumerable<IMultiGetHit<T>> respectively.
IMultiGetHit<T> contains the original document which can be found in the Source property, a FieldSelection
collection containing specific fields if they were requested, and some additional meta data from Elasticsearch.
The IMultiGetResponse object also contains a Documents property of type IEnumerable<IMultiGetHit<object>>
which holds all of the retrieved documents regardless of type.
Field Selectionedit
MultiGet also allows you to retrieve specific fields of a document:
var results = client.MultiGet(m => m
.Get<ElasticsearchProject>(g => g
.Id(1)
.Fields(p => p.Id, p => p.Followers.First().FirstName)
)
.Get<Person>(g => g.Id(100))
.Get<Person>(g => g
.Id(105)
.Type("people")
.Index("nest_test_data")
.Fields(p => p.Id, p => p.FirstName)
)
);Which can then be retrieved directly from the IMultiGetResponse object
var fields = results.GetFieldSelection<ElasticsearchProject>(1); var id = fields.FieldValues<int>(p => p.Id); var firstNames = fields.FieldValues<string[]>(p => p.Followers.First().FirstName);
Remember expressions like p => p.Followers.First().FirstName can be interchanged with "followers.firstName"
if you prefer or need to reference a non-mapped field.