Any way to get NEST to deserialize directly into the results?

I am currently looking at the ElasticSearch.Net/NEST client entry as a possible replacement for PlainElastic.Net (since ElasticSearch.Net has a failover feature that I want to use)

In PlainElastic, I can write something like:

var command = new SearchCommand(index, type);
var result = Connection.Post(command, query);
var searchResult = Serializer.ToSearchResult<T>(result);
return searchResult.Documents;

      

This will return IEnumerable, where each of the results is of type T. I want something like this in NEST, and where I start with an initial test:

var result = client.Search<T>("index", "type", query, null);

      

But I can't find a way to deserialize the results in the same way as PlainElastic.Net using the ToSearchResult method. Does Elasticearch.Net/NEST provide such a way?

08/05/2015: Sorry poorly worded question. What I originally tried with NEST was the untyped version:

var result = client.Search("index", "type", query, null);

      

which was returning a result that I was trying to deserialize separately, because the original attempt at a typed version:

var result = client.Search<T>("index", "type", query, null);

      

throws an exception:

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=Elasticsearch.Net
  StackTrace:
       at     Elasticsearch.Net.Serialization.PocoJsonSerializerStrategy.DeserializeObject(    Object value, Type type) in C:\code\elasticsearch-    net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1370
       at Elasticsearch.Net.Serialization.SimpleJson.DeserializeObject(String json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 553
   at Elasticsearch.Net.Serialization.SimpleJson.DeserializeObject[T](String json) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 570
   at Elasticsearch.Net.Serialization.ElasticsearchDefaultSerializer.Deserialize[T](Stream stream) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Serialization\ElasticsearchDefaultSerializer.cs:line 27
   at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.StreamToTypedResponse[T](ElasticsearchResponse`1 streamResponse, ITransportRequestState requestState, Byte[] readBytes) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\RequestHandlers\RequestHandler.cs:line 254
   at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.ReturnTypedResponse[T](TransportRequestState`1 requestState, ElasticsearchResponse`1 streamResponse, ElasticsearchServerError& error) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\RequestHandlers\RequestHandler.cs:line 106
   at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.CoordinateRequest[T](TransportRequestState`1 requestState, Int32 maxRetries, Int32 retried, Boolean& aliveResponse) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\RequestHandlers\RequestHandler.cs:line 131
   at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.DoRequest[T](TransportRequestState`1 requestState) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\RequestHandlers\RequestHandler.cs:line 177
   at Elasticsearch.Net.Connection.RequestHandlers.RequestHandler.Request[T](TransportRequestState`1 requestState, Object data) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\RequestHandlers\RequestHandler.cs:line 34
   at Elasticsearch.Net.Connection.Transport.DoRequest[T](String method, String path, Object data, IRequestParameters requestParameters) in C:\code\elasticsearch-net\src\Elasticsearch.Net\Connection\Transport.cs:line 343
   at Elasticsearch.Net.ElasticsearchClient.DoRequest[T](String method, String path, Object data, IRequestParameters requestParameters) in C:\code\elasticsearch-net\src\Elasticsearch.Net\ElasticsearchClient.cs:line 65
   at Elasticsearch.Net.ElasticsearchClient.Search[T](String index, String type, Object body, Func`2 requestParameters) in C:\code\elasticsearch-net\src\Elasticsearch.Net\ElasticsearchClient.Generated.cs:line 33515

      

So I suppose my original question is still the same, but is more trying to understand why NEST is fetching the results in an untyped version, but not serializing in a type version.

+3


source to share


2 answers


SearchResponse<T>

has a Hits property (like IEnumberable<IHit<T>>

, if I remember correctly.).

Each hit has a Source property, which is of type T.

So



var enumerable = results.Hits.Select(h => h.Source);

      

gives you IEnumerable<T>

.

+5


source


The answer to your request will be Nest.ISearchResponse<T>

. By accessing the Documents property in response, you will get IEnumerable<T>

, which is a list of results that match your search.



Update To answer in the updated question: T

there var result = client.Search<T>("index", "type", query, null);

should be an exact "type"

one that you include in your team, not Generic T.

+1


source







All Articles