关闭

ELaticSearch——PlainElastic.net.dll 中的JsonNetSerializer

1085人阅读 评论(0) 收藏 举报
分类:

之前为了尽量减少对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还做了异步查询,看来还得重构代码



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:368940次
    • 积分:5252
    • 等级:
    • 排名:第5803名
    • 原创:159篇
    • 转载:75篇
    • 译文:16篇
    • 评论:122条
    博客专栏
    最新评论