之前为了尽量减少对ES类库的使用,对于ES查询返回的结果,直接使用NewtonJson的json转化器,
结果最后发现搜索结果的Json中有聚合的结果,但是转化成SearchResult<object> 就怎么也看不到FacetResult部分。
因此,寻寻觅觅终于找到原因所在,不过令人头疼的是PlainElastic.net.dll 最新的将facet标注为过期,
[Obsolete("Facets are deprecated and will be removed in a future release. You are encouraged to migrate to aggregations instead.")]
public class Facets<T> : QueryBase<Facets<T>>
{}
但是在SearchResult中还是使用的facet 而不是Aggeragation。这个当前的做法其实是存在风险的,万一彻底去掉了,就需要修改代码部分的实现。
public class SearchResult<T> : BaseResult
{
public int took;
public bool timed_out;
public ShardsResult _shards;
public SearchHits hits;
public SearchFacets <span style="color:#ff0000;">facets;</span>
public string _scroll_id;
public IEnumerable<T> Documents
{
get { return hits.hits.Select(hit => hit._source); }
}
}
PlainElastic.net.dll 中的json转化器做了特殊的处理,其实使用的也是NewtonJson,只不过添加了几个特殊的转化器。
代码如下:
public class JsonNetSerializer: IJsonSerializer
{
public JsonSerializerSettings Settings { get; set; }
public JsonNetSerializer()
{
Settings = new JsonSerializerSettings();
Settings.Converters.Add(new IsoDateTimeConverter());
Settings.Converters.Add(new FacetCreationConverter());
Settings.NullValueHandling = NullValueHandling.Ignore;
}
public string Serialize(object o)
{
return JsonConvert.SerializeObject(o, Formatting.None, Settings);
}
public object Deserialize(string value, Type type)
{
return JsonConvert.DeserializeObject(value, type, Settings);
}
}
总而言之,还是用他自己的吧,就不费劲写自己的转化器了 。
另外发现ES还做了异步查询,看来还得重构代码