zoukankan      html  css  js  c++  java
  • ElasticSearch7.x:C#的Nest客户端分组,多字段排序-Tems-TopHis

    var mustQuerys = new List<Func<QueryContainerDescriptor<toutiao>, QueryContainer>>();//筛选
    //多组排序
    //List<Func<SortDescriptor<toutiao>, IPromise<IList<ISort>>>> sort = new List<Func<SortDescriptor<toutiao>, IPromise<IList<ISort>>>>();
    //sort.Add(srt => srt.Field(sf => sf.Field(p => p.addtime).Order(SortOrder.Descending)));
    //query.Add(q => q.Match(t => t.Field("title").Query("生产")));
    mustQuerys.Add(q => q.Match(m => m.Field(f => f.title).Query("旋转"))); //筛选
    //List<Func<FieldSortDescriptor<toutiao>, IFieldSort>> sort = new List<Func<FieldSortDescriptor<toutiao>, IFieldSort>>();

    //////排序
    //Func<SortDescriptor<toutiao>, IPromise<IList<ISort>>> sortDesc = sd =>
    //{
    // //根据分值排序
    // // sd.Descending(SortSpecialField.Score);

    // //排序
    // if (1 == 1)
    // sd.Descending(d => d.cid);
    // else
    // sd.Descending(d => d.cid);
    // return sd;
    //};
    Func<MaxAggregationDescriptor<toutiao>, IMaxAggregation> maxagg = sd1 => sd1.Field("addtime");//排序字段
    Func<MaxAggregationDescriptor<toutiao>, IMaxAggregation> maxrankid = sd2 => sd2.Field("rankid");//排序字段
    //List<Func<MaxAggregationDescriptor<toutiao>, IMaxAggregation>> maxagg1 = new List<Func<MaxAggregationDescriptor<toutiao>, IMaxAggregation>>();
    //maxagg1.Add(m=>m.Field("rankid"));
    //maxagg1.Add(m => m.Field("addtime"));
    //sd => sd.Field("addtime");
    //权限=》时间
    Func<TermsOrderDescriptor<toutiao>, IPromise<IList<TermsOrder>>> orderra = or => or.Descending("order_rankid_key").Descending("order_addtime_key");
    //时间
    Func<TermsOrderDescriptor<toutiao>, IPromise<IList<TermsOrder>>> orderdt = or => or.Descending("order_addtime_key");
    //List<Func<FieldSortDescriptor<toutiao>, IFieldSort>> sort1 = new List<Func<FieldSortDescriptor<toutiao>, IFieldSort>>();
    //sort.Add(sf => sf.Field(p => p.addtime).Order(SortOrder.Descending));
    //List<Func<QueryContainerDescriptor<toutiao>, QueryContainer>> query = new List<Func<QueryContainerDescriptor<toutiao>, QueryContainer>>();
    ////一个月之内的搜索记录
    //query.Add(q => q.Term(t => t.Field("title").Value("阶段")));

    var searchResponse = client.Search<toutiao>(s => s
    .Query(q => q.Bool(b => b.Must(mustQuerys.ToArray())))
    .Aggregations(aggs => aggs
    .Terms("group_by_cid", t => t //分组
    .Order(orderra)//排序,对应max
    .Field(p => p.cid)//分组字段

    .Aggregations(aa => aa
    .Max("order_addtime_key", maxagg)//构建分组排序字段
    .Max("order_rankid_key", maxrankid)//构建分组排序字段
    .TopHits("top_cid_hits", th => th //返回前几行
    //.Sort(sortDesc)
    .Size(1)
    //.Sort(s=>s.Descending(f=>f.rankid))
    .Source(src => src.Includes(fs => fs //返回字段
    .Field(p => p.title)
    .Field(p => p.addtime)
    .Field(p => p.cid)
    .Field(p => p.rankid)
    ))
    .Highlight(h => h
    .Fields(hf => hf.Field(p => p.title)
    .PreTags("<b style='color:red'>")
    .PostTags("</b>")))

    )

    ))));
    var results = new List<toutiao>();
    var terms = searchResponse.Aggregations.Terms("group_by_cid"); //获取分组结果集

    foreach (var bucket in terms.Buckets)
    {
    var hitcid = bucket.TopHits("top_cid_hits");//获取分组子集结果集
    //关键词高亮显示
    foreach (var hi in hitcid.Hits<toutiao>())
    {
    foreach (var highlightField in hi.Highlight)
    {
    if (highlightField.Key == "title")
    {
    foreach (var highlight in highlightField.Value)
    {
    hi.Source.Htitle = highlight.ToString();
    }
    }
    }
    results.Add(hi.Source);

    }
    //var device = hitcid.Hits<toutiao>().First();// hitcid.Documents<toutiao>().First();

    //results.Add(device.Source);
    //var device1 = hitcid.Documents<toutiao>().ToList<toutiao>();
    //foreach (var item in device1)
    //{
    // results.Add(item);
    //}
    }

  • 相关阅读:
    对象遍历 for in ,数组遍历for in 与 for of 的区别
    计算一个数组中key值相同的数量
    VUE的两种跳转push和replace对比区别
    微信公众号二次分享ios分享失败问题
    获得对象中的键或值
    第一个table根据checkbox选择tr,在另一个table中显示对应索引的tr(jq遍历的运用)
    checkbox 全选反选 获得所有的checkbox
    为什么jQuery要return this.each()?
    用jq代码写出一个轮播图。
    页面滚动到一定位置,两个div 朝中间运动。
  • 原文地址:https://www.cnblogs.com/wangwenlong8/p/13698026.html
Copyright © 2011-2022 走看看