我目前正在寻找编写ElasticSearch.Net/NEST客户端,以替代PlainElastic.Net(因为ElasticSearch.Net具有我要使用的故障转移功能)

在PlainElastic中,我可以编写如下内容:

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

这将返回IEnumerable,其中每个结果均为T类型。
我希望在NEST中有类似的东西,而我最初的测试是:
var result = client.Search<T>("index", "type", query, null);

但是我似乎找不到像PlainElastic.Net使用ToSearchResult方法那样将反序列化为结果的方法。 Elasticsearch.Net/NEST是否提供这种方式?

2015年5月5日:道歉,措辞不好。我最初尝试使用NEST的是未键入的版本:
var result = client.Search("index", "type", query, null);

这带来了我尝试分别反序列化的结果,因为原始尝试使用键入的版本:
var result = client.Search<T>("index", "type", query, null);

抛出异常:
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

因此,我想我原来的问题仍然是相同的,但是更多地试图理解为什么NEST确实会在无类型版本中检索结果,但在类型版本中却无法进行序列化。

最佳答案

SearchResponse<T>具有Hits属性(如果我没有记错的话,类型为IEnumberable<IHit<T>>)。

每个匹配项都具有Source属性,其类型为T。

所以

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

给你你的IEnumerable<T>

10-01 16:58
查看更多