• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ElasticSearch:Quick.ElasticSearch.Furion组件的使用

武飞扬头像
qubernet
帮助1

ElasticSearch 使用说明
本章,我们主要讲解在.Net 中对Quick.ElasticSearch.Furion的使用进行介绍!

ElasticSearch 的官方客户端 API 文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html

ElasticSearch 的官方客户端 API 文档地址(.Net,ElasticSearch8.x):https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/index.html

ElasticSearch 的官方客户端 API 文档地址(.Net,ElasticSearch7.x):https://www.elastic.co/guide/en/elasticsearch/client/net-api/7.17/index.html

我们知道,在.Net 中有Elasticsearch.NetNEST等组件可以对 ElasticSearch 服务端进行各种操作。

但是但是但是,由于 ElasticSearch 提供的是各类 API 接口,并且查询参数(JSON)条件会有很深的嵌套,这就导致了Elasticsearch.NetNEST等组件在使用的时候也有很深的内嵌条件,包括各种链式操作等,如果不是老手使用难度非常大,为了降低使用难度,Quick.ElasticSearch.Furion组件由此诞生了。

为了更好更简单的在.Net Core 中使用 ElasticSearch,特此基于NEST封装了Quick.ElasticSearch.Furion组件。

  • Quick.ElasticSearch.Furion:依赖于.Net6 、Furion

Quick.ElasticSearch.Furion 包地址为:https://www.nuget.org/packages/Quick.ElasticSearch.Furion

关于 Quick.ElasticSearch.Furion 的详细使用说明,如下所示:

1、🍹 更新日志

  • 1.0.3

    • 调整(简化)了方法GetModelsAllGetModelsAllAsyncGetModelsGetModelsAsyncGetModelsFieldsGetModelsFieldsAsync的排序参数传入方式;

    • 调整了InsertModelsInsertModelsAsync方法的内部实现,判断是否有添加失败采用了Errors属性以及ItemsWithErrors错误对象集合;

    • 增加了InsertModelsBatch方法,分批添加数据,适用于大批量添加数据的情况;

    • 调整了GetGroupValuesGetGroupValuesAsyncGetGroupCountGetGroupCountAsyncGetGroupCountSmmaGetGroupCountSmmaAsyncGetGroupsCountGetGroupsCountAsyncGetGroupsDateGetGroupsDateAsyncGetGroupsDateSmmaGetGroupsDateSmmaAsyncGetGroupsDateSubGetGroupsDateSubAsyncGetStatiCountGetStatiCountAsyncGetStatiSumMultiGetStatiSumMultiAsync方法的内部实现;

    • 调整了AddLike扩展方式的实现方式为 Wildcard;

    • 增加了AddIn条件查询扩展方法,类似 SQL 的 IN 条件;

    • GetStatiSumMultiGetStatiSumMultiAsync方法进行了性能优化,减少了 Http 请求次数。

  • 1.0.2

    • 方法GetGroupsCountGetGroupsCountAsync增加了第三个参数,以便于用户自定义返回统计数量的 Key 名称,默认为:GroupCount;

    • 增加了获取ElasticClient客户端对象方法:GetClient;

    • 增加获取所有索引的方法GetIndexsGetIndexsAsync

    • 增加了根据主键 Id 修改一个或多个字段值的方法UpdateModelFieldsByIdUpdateModelFieldsByIdAsync

    • 增加了根据查询条件修改一个或多个字段值的方法UpdateModelFieldsByConUpdateModelFieldsByConAsync

    • 增加了根据 Id 字段获取一条数据的方法GetModelGetModelAsync

    • 调整了InsertModelsInsertModelsAsync方法的实现,由原来的Bulk(BulkAsync)调整为了IndexMany(IndexManyAsync)方式。

  • 1.0.1

    • 增加了扩展方法 CreateEsQueryModel 和 AddEsQueryModel;

    • 重写了查询条件的使用方式;

    • 将所有涉及到查询条件的方法都进行了调整;

    • 简化了GetStatiSumMultiGetStatiSumMultiAsync方法所需参数的传入方式;

    • 方法GetStatiSumMultiGetStatiSumMultiAsync增加了第三个参数,错误回调方法。

  • 1.0.0

    • 全新组件重磅发布;

    • 支持切换连接功能;

    • 支持检查创建删除索引;

    • 支持获取索引健康状态;

    • 支持添加数据;

    • 支持修改数据;

    • 支持删除数据;

    • 支持获取数据;

    • 支持分组统计查询;

    • 支持获取总条数、最大、最小、求和或平均值等。


2、🍟 Quick.ElasticSearch.Furion 使用说明

该组件是基于NESTFurion组件进行封装使用的,目的在于结合.Net Core 更快、更简单和更灵活的使用 ElasticSearch!!!

组件使用对比:

假设我们要实现如下数据格式的统计:

  1.  
    [
  2.  
    {
  3.  
    "Name": "2021-01",
  4.  
    "Count": 100,
  5.  
    "Group": [
  6.  
    {
  7.  
    "Name": "碎石",
  8.  
    "Count": 3,
  9.  
    "Sum": 1000,
  10.  
    "Max": 100,
  11.  
    "Min": 10,
  12.  
    "Avg": 50
  13.  
    }
  14.  
    ]
  15.  
    }
  16.  
    ]
学新通

使用 Quick.ElasticSearch.Furion 组件的代码如下:

  1.  
    //获取分组统计数据(日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值)
  2.  
    //统计的时间间隔维度支持的表达式有(1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)
  3.  
    //定义查询条件:(Id >= 1)
  4.  
    var queryCon = QuickElasticSearchExtension
  5.  
    //创建条件(默认创建了一个组合条件)
  6.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  7.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  8.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  9.  
    (queryCon) =>
  10.  
    {
  11.  
    //查询条件:(Id >= 1)
  12.  
    queryCon.AddGte(m => m.Id, 1);
  13.  
    });
  14.  
     
  15.  
    //同步
  16.  
    var retGetGroupsDateSub = _quickElasticSearch.GetGroupsDateSub<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, "1h", "yyyy-MM-dd HH:mm", queryCon);
  17.  
     
  18.  
    //异步
  19.  
    var retGetGroupsDateSubAsync = await _quickElasticSearch.GetGroupsDateSubAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, "1h", "yyyy-MM-dd HH:mm", queryCon);
学新通

使用 NEST 组件的代码如下:

  1.  
    /// <summary>
  2.  
    /// 获取分组统计数据(日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值)
  3.  
    /// </summary>
  4.  
    /// <typeparam name="T"></typeparam>
  5.  
    /// <param name="field">要分组的字段(日期字段),格式如:m=>m.CreateTime</param>
  6.  
    /// <param name="fieldGroup">另一个要分组的字段,格式如:m=>m.TypeName</param>
  7.  
    /// <param name="fieldGroupStati">要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price</param>
  8.  
    /// <param name="dateInterval">统计的日期间隔,默认为1M(支持的表达式有1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)</param>
  9.  
    /// <param name="dateFormat">统计的日期格式化方式,默认为yyyy-MM(注意大小写,完整的格式化格式为yyyy-MM-dd HH:mm:ss)</param>
  10.  
    /// <param name="esQueryList">动态查询条件</param>
  11.  
    /// <returns>返回元组对象,包含3个值,第一个为是否成功,第二个为失败的提示信息,第三个为<![CDATA[List<Dictionary<string, object>>]]>的集合,格式如:[{"Name":"2021-01","Count":100,"Group":[{"Name":"碎石","Count":3,"Sum":1000,"Max":100,"Min":10,"Avg":50}]}]</returns>
  12.  
    public (bool IsSucc, string ErrMsg, List<Dictionary<string, object>>? Data) GetGroupsDateSub<T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) where T : class, new()
  13.  
    {
  14.  
    try
  15.  
    {
  16.  
    //查询条件
  17.  
    Func<QueryContainerDescriptor<T>, QueryContainer> query = q =>
  18.  
    {
  19.  
    QueryContainer ret = q;
  20.  
     
  21.  
    if (esQueryList != null && esQueryList.Count > 0)
  22.  
    {
  23.  
    //组装条件为&&或||关系
  24.  
    for (int i = 0; i < esQueryList.Count; i )
  25.  
    {
  26.  
    if (esQueryList[i].QueryCon.Count > 0)
  27.  
    {
  28.  
    if (i == 0)
  29.  
    {
  30.  
    ret = esQueryList[i].QueryType == EsQueryType.And ? q.Bool(b => b.Must(esQueryList[i].QueryCon)) : q.Bool(b => b.Should(esQueryList[i].QueryCon));
  31.  
    }
  32.  
    else
  33.  
    {
  34.  
    ret = esQueryList[i].PrevConType == EsQueryType.And ?
  35.  
    ret && (esQueryList[i].QueryType == EsQueryType.And ? q.Bool(b => b.Must(esQueryList[i].QueryCon)) : q.Bool(b => b.Should(esQueryList[i].QueryCon))) ://添加&&并且关系
  36.  
    ret || (esQueryList[i].QueryType == EsQueryType.And ? q.Bool(b => b.Must(esQueryList[i].QueryCon)) : q.Bool(b => b.Should(esQueryList[i].QueryCon))); //添加||或关系
  37.  
    }
  38.  
    }
  39.  
    }
  40.  
    }
  41.  
     
  42.  
    return ret;
  43.  
    };
  44.  
     
  45.  
    var ret = new List<Dictionary<string, object>>();
  46.  
     
  47.  
    var response = _client.Search<T>(s => s
  48.  
    .Index(GetIndexName<T>())
  49.  
    .Query(query)
  50.  
    .Aggregations(ag => ag
  51.  
    .DateHistogram("StatiGroup", dh => dh
  52.  
    .Field(field) //需要聚合分组的字段名称, 类型需要为date, 格式没有要求
  53.  
    .CalendarInterval(dateInterval) //时间间隔,此处设置为1个月(1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)
  54.  
    .TimeZone(" 08:00") //设置时区, 这样就相当于东八区的时间
  55.  
    .Format(dateFormat) //返回值格式化,HH大写,不然不能区分上午、下午
  56.  
    .MinimumDocumentCount(0) //为空的话则填充0
  57.  
    .Order(HistogramOrder.KeyAscending) //根据日期字段升序排列
  58.  
     
  59.  
    .Aggregations(ag => ag
  60.  
    .Terms("StatiGroup-1", t => t
  61.  
    .Field(fieldGroup)
  62.  
    .Size(_allConfig.MaxQueryCount)
  63.  
    .Order(o => o
  64.  
    .KeyAscending() //按照分组字段升序排序
  65.  
    .CountAscending()//按照统计数量升序排序
  66.  
    )
  67.  
     
  68.  
    //统计fieldStati字段的总和、最大值、最小值和平均值
  69.  
    .Aggregations(ags => ags
  70.  
    .Sum("StatiSum", m => m.Field(fieldGroupStati)) //求和
  71.  
    .Max("StatiMax", m => m.Field(fieldGroupStati)) //最大值
  72.  
    .Min("StatiMin", m => m.Field(fieldGroupStati)) //最小值
  73.  
    .Average("StatiAvg", m => m.Field(fieldGroupStati)) //平均值
  74.  
    )
  75.  
    )
  76.  
    )
  77.  
    )
  78.  
    )
  79.  
    .TrackTotalHits(true)//TrackTotalHits必须设置为true,否则返回total总条数超过10000条时总是返回10000
  80.  
    );
  81.  
     
  82.  
    if (response.IsValid)
  83.  
    {
  84.  
    //获取分组标识
  85.  
    var stati = response.Aggregations["StatiGroup"];
  86.  
    //获取分组后的集合
  87.  
    var statiItems = ((BucketAggregate)stati).Items;
  88.  
     
  89.  
    foreach (var bucketMain in statiItems)
  90.  
    {
  91.  
    var item = (DateHistogramBucket)bucketMain;
  92.  
    var retGroup = new List<Dictionary<string, object>>();
  93.  
     
  94.  
    foreach (var bucket in ((Nest.BucketAggregate)(item.Values.ToList()[0])).Items)
  95.  
    {
  96.  
    var obj = (KeyedBucket<Object>)bucket;
  97.  
     
  98.  
    retGroup.Add(new Dictionary<string, object> {
  99.  
    { "Name",obj.Key.ToString()!},
  100.  
    { "Count",obj.DocCount??0},
  101.  
    { "Sum",IsNotNull(obj.AverageBucket("StatiSum").Value)? ToDouble2Dec(obj.AverageBucket("StatiSum").Value!):0},
  102.  
    { "Max",IsNotNull(obj.AverageBucket("StatiMax").Value)? ToDouble2Dec(obj.AverageBucket("StatiMax").Value!):0},
  103.  
    { "Min",IsNotNull(obj.AverageBucket("StatiMin").Value)? ToDouble2Dec(obj.AverageBucket("StatiMin").Value!):0},
  104.  
    { "Avg",IsNotNull(obj.AverageBucket("StatiAvg").Value)? ToDouble2Dec(obj.AverageBucket("StatiAvg").Value!):0},
  105.  
    });
  106.  
    }
  107.  
     
  108.  
    ret.Add(new Dictionary<string, object>
  109.  
    {
  110.  
    { "Name",item.KeyAsString},
  111.  
    { "Count",item.DocCount??0},
  112.  
    { "Group",retGroup}
  113.  
    });
  114.  
    }
  115.  
    }
  116.  
     
  117.  
    return (response.IsValid, !response.IsValid ? response.DebugInformation : string.Empty, ret);
  118.  
    }
  119.  
    catch (Exception ex)
  120.  
    {
  121.  
    return (false, ex.Message, null);
  122.  
    }
  123.  
    }
学新通

由此可见,NEST 使用的复杂程度,更不用说 ElasticSearch.Net 了。

功能说明:

  • 根据配置文件读取 ElasticSearch 连接的各个配置(如:ElasticSearch 服务地址、账号和密码等);

  • 支持配置多个 ElasticSearch 的连接配置;

  • 支持动态切换 ElasticSearch 的连接配置;

  • 支持检查创建删除索引;

  • 支持获取索引健康状态;

  • 支持添加数据(单条、多条);

  • 支持修改数据(单条、多条);

  • 支持删除数据(根据 Id 删除、根据条件删除);

  • 支持获取数据(获取所有数据、获取所有满足条件的数据、获取所有满足条件并返回指定字段的数据、根据 Id 获取一条数据、获取分页的数据、获取分页并返回指定字段的数据);

  • 支持分组统计查询(统计单字段并返回该字段所有统计值、统计单字段并返回该字段所有统计值及对应的数量、统计单段并返回另一个字段的总和最大值最小值和平均值、统计多个字段并返回多个字段对应的值以及对应分组的数据数量、按月统计并返回每个月及其数量、获取分组统计数据【日期字段分组,支持按年、季度、月份、星期、天、小时、分、秒等维度进行统计】、获取分组统计数据【日期字段分组,按月统计,并返回另一个字段的总和、最大值、最小值和平均值】、获取分组统计数据【日期字段分组,并返回另一个字段的总和、最大值、最小值和平均值】、获取分组统计数据【日期字段分组,按某年 1~12 月统计每个月的某个字段每个月的总和以及这一年的总和】、获取分组统计数据【日期字段分组,按月统计,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值】、获取分组统计数据【日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值】);

  • 支持获取总条数、最大、最小、求和或平均值等(获取符合条件的数据总条数、获取某字段的最大值最小值求和平均值和总数等、获取某些字段相加的多个总和)。


3、🍖 安装

安装命令如下所示:

Install-Package Quick.ElasticSearch.Furion

该组件的命名空间为:Quick.ElasticSearch

学新通

学新通


4、🧀 配置

4.1、🥞 配置appsettings.json

appsettings.json配置文件中创建节点QuickElasticSearch>MaxQueryCountQuickElasticSearchConfigs,MaxQueryCount 为 ElasticSearch 索引查询的最大条数(ElasticSearch 内部默认为 10000),QuickElasticSearchConfigs 为数组类型(即可配置多个 ElasticSearch 服务地址),具体配置如下所示:

  1.  
    {
  2.  
    "QuickElasticSearch": {
  3.  
    "MaxQueryCount": 2000000000,
  4.  
    "QuickElasticSearchConfigs": [
  5.  
    {
  6.  
    "Default": true,
  7.  
    "ConnId": 1,
  8.  
    "DefaultIndex": "",
  9.  
    "UserName": "elastic",
  10.  
    "Password": "123456",
  11.  
    "Uri": ["http://192.168.3.200:9200/"]
  12.  
    }
  13.  
    ]
  14.  
    }
  15.  
    }
学新通

配置说明:

属性名称 属性说明 是否必填 备注
MaxQueryCount 全局设置 ElasticSearch 索引查询的最大条数,ElasticSearch 默认为 10000   注意:此处我们最好设置为 2000000000,原因是 ElasticSearch 内部默认一次性最多返回 10000 条数据
       
Default 是否为默认连接   默认为 false
ConnId 连接 Id(请确保该 Id 的唯一性) 如果要动态切换连接配置,请确保该 Id 有值并且唯一
DefaultIndex 默认索引    
UserName 连接账户  
Password 连接密码  
Uri 连接地址集合,数据类型为 List<string>  

4.2、🍞 实体特性

我们为实体提供了QuickElasticSearchConfig特性,起作用是设置该实体的索引名称主键字段,如下所示就是我们定义的一个实体对象:

  1.  
    using Nest;
  2.  
     
  3.  
    namespace Quick.ElasticSearch.TestFurion
  4.  
    {
  5.  
    [QuickElasticSearchConfig(indexName: "test_index", primaryKey: "Id")]
  6.  
    public class TestElasticSearchModel
  7.  
    {
  8.  
    public long Id { get; set; }
  9.  
     
  10.  
    [Keyword]
  11.  
    public string UserType { get; set; }
  12.  
     
  13.  
    public int UserId { get; set; }
  14.  
     
  15.  
    [Keyword]
  16.  
    public string UserName { get; set; }
  17.  
     
  18.  
    public int UserAge { get; set; }
  19.  
     
  20.  
    public float Money { get; set; }
  21.  
     
  22.  
    public float MoneyOth { get; set; }
  23.  
     
  24.  
    public DateTime CreateTime { get; set; }
  25.  
    }
  26.  
    }
学新通

说明:

  • indexName:索引名称;

  • primaryKey:主键名称。

4.3、🥐 配置 Program.cs

由于我们使用的是Furion,因此,我们可在程序启动文件中配置如下代码(具体可参考Furion 入门指南),目的是注册ElasticSearch 服务

  1.  
    [STAThread]
  2.  
    static void Main()
  3.  
    {
  4.  
    ApplicationConfiguration.Initialize();
  5.  
     
  6.  
    //初始化Furion
  7.  
    Serve.Run(GenericRunOptions.DefaultSilence);
  8.  
    }
  1.  
    public void ConfigureServices(IServiceCollection services)
  2.  
    {
  3.  
    //注册FrmMain窗体类
  4.  
    services.AddScoped<FrmMain>();
  5.  
     
  6.  
    //注入IQuickElasticSearch的方式
  7.  
    //通过AddElasticSearch添加依赖注入
  8.  
    services.AddElasticSearch();
  9.  
     
  10.  
    使用构造函数获取实例的方式:
  11.  
    通过AddElasticSearch添加依赖注入,并注册TestConsumerClassForDI类
  12.  
    //services.AddElasticSearch<TestConsumerClassForDI>()
  13.  
     
  14.  
    //DI容器生成serviceProvider
  15.  
    var serviceProvider = services.BuildServiceProvider();
  16.  
     
  17.  
    //通过serviceProvider获取MainForm的注册实例
  18.  
    var frmMain = serviceProvider.GetRequiredService<FrmMain>();
  19.  
    //var frmMain = (FrmMain)serviceProvider.GetService(typeof(FrmMain));
  20.  
     
  21.  
    Application.Run(frmMain);
  22.  
    }
学新通

说明:上述的关键点就在于调用.AddElasticSearch()或者.AddElasticSearch<T>()方法对服务进行注册。

4.4、🍝 获取依赖注入对象

定义IQuickElasticSearch对象(依赖注入方式):

  1.  
    public partial class FrmMain : Form
  2.  
    {
  3.  
    //定义IQuickElasticSearch对象
  4.  
    private readonly IQuickElasticSearch _quickElasticSearch;
  5.  
     
  6.  
    public FrmMain(IQuickElasticSearch quickElasticSearch)
  7.  
    {
  8.  
    InitializeComponent();
  9.  
     
  10.  
    //设置IQuickElasticSearch对象
  11.  
    _quickElasticSearch = quickElasticSearch;
  12.  
    }
  13.  
    }

5、🥪 具体使用

5.1、📮 获取 ElasticSearch 客户端

使用示例:

_quickElasticSearch.GetClient();

5.2、🌮 切换连接

使用示例:

_quickElasticSearch.ChangeConn(2);

5.3、🌯 获取检查创建删除索引

使用示例(获取所有索引):

  1.  
    //同步
  2.  
    var retGetIndexs = _quickElasticSearch.GetIndexs();
  3.  
     
  4.  
    //异步
  5.  
    var retGetIndexsAsync = await _quickElasticSearch.GetIndexsAsync();

使用示例(检查索引是否存在):

  1.  
    //同步
  2.  
    var retIndexIsExist = _quickElasticSearch.IndexIsExist();
  3.  
     
  4.  
    //异步
  5.  
    var retIndexIsExistAsync = await _quickElasticSearch.IndexIsExistAsync();

使用示例(创建索引):

  1.  
    //同步
  2.  
    var retCreateIndex = _quickElasticSearch.CreateIndex<TestElasticSearchModel>();
  3.  
     
  4.  
    //异步
  5.  
    var retCreateIndexAsync = await _quickElasticSearch.CreateIndexAsync<TestElasticSearchModel>();

使用示例(删除索引):

  1.  
    //同步
  2.  
    var retDeleteIndex = _quickElasticSearch.DeleteIndex();
  3.  
     
  4.  
    //异步
  5.  
    var retDeleteIndexAsync = await _quickElasticSearch.DeleteIndexAsync();

5.4、🥙 获取索引健康状态

使用示例(获取索引健康状态):

  1.  
    //同步
  2.  
    var retGetHealthStatus = _quickElasticSearch.GetHealthStatus();
  3.  
     
  4.  
    //异步
  5.  
    var retGetHealthStatusAsyncc = await _quickElasticSearch.GetHealthStatusAsync();

5.5、🧆 添加数据

使用示例(添加数据-单条):

  1.  
    var rand = new Random(Guid.NewGuid().GetHashCode());
  2.  
    var testData = new TestElasticSearchModel
  3.  
    {
  4.  
    Id = YitIdHelper.NextId(),
  5.  
    UserId = rand.Next(1, 9999),
  6.  
    UserName = "Quber",
  7.  
    UserAge = rand.Next(20, 80),
  8.  
    Money = (float)1.429,
  9.  
    MoneyOth = (float)2.556,
  10.  
    CreateTime = DateTime.Now
  11.  
    };
  12.  
    var testDataAsync = new TestElasticSearchModel
  13.  
    {
  14.  
    Id = YitIdHelper.NextId(),
  15.  
    UserId = rand.Next(1, 9999),
  16.  
    UserName = "Jack",
  17.  
    UserAge = rand.Next(20, 80),
  18.  
    Money = (float)1.429,
  19.  
    MoneyOth = (float)2.556,
  20.  
    CreateTime = DateTime.Now
  21.  
    };
  22.  
     
  23.  
    //同步
  24.  
    var retInsertModel = _quickElasticSearch.InsertModel(testData);
  25.  
     
  26.  
    //异步
  27.  
    var retInsertModelAsync = await _quickElasticSearch.InsertModelAsync(testDataAsync);
学新通

使用示例(添加数据-多条):

  1.  
    var testDatas = new List<TestElasticSearchModel>
  2.  
    {
  3.  
    new TestElasticSearchModel(),
  4.  
    new TestElasticSearchModel()
  5.  
    };
  6.  
     
  7.  
    //同步
  8.  
    var retInsertModels = _quickElasticSearch.InsertModels(testDatas, (errList, errMsg, allList) =>
  9.  
    {
  10.  
    var thisErrList = errList;
  11.  
    var thisErrMsg = errMsg;
  12.  
    });
  13.  
     
  14.  
    //异步
  15.  
    var retInsertModelsAsync = await _quickElasticSearch.InsertModelsAsync(testDatas, async (errList, errMsg, allList) =>
  16.  
    {
  17.  
    var thisErrList = errList;
  18.  
    var thisErrMsg = errMsg;
  19.  
     
  20.  
    await Task.CompletedTask;
  21.  
    });
学新通

使用示例(添加数据-多条,分批次):

  1.  
    var testDatas = new List<TestElasticSearchModel>
  2.  
    {
  3.  
    new TestElasticSearchModel(),
  4.  
    new TestElasticSearchModel()
  5.  
    };
  6.  
     
  7.  
    var retInsertModelsBatch = _quickElasticSearch.InsertModelsBatch(testDatas, (errList, errMsg, allList) =>
  8.  
    {
  9.  
    var thisErrList = errList;
  10.  
    var thisErrMsg = errMsg;
  11.  
    },
  12.  
     
  13.  
    //每批次添加的数据条数
  14.  
    1000,
  15.  
     
  16.  
    //集群繁忙,报429错误码的时候,等待多久进行重试
  17.  
    "5s",
  18.  
     
  19.  
    //重试次数
  20.  
    2);
学新通

5.6、🥗 修改数据

使用示例(修改数据-根据主键 Id 修改一个或多个字段的值):

  1.  
    //类似SQL:UPDATE A SET col1=123,col2=456 WHERE Id=1
  2.  
     
  3.  
    //同步
  4.  
    var retUpdateModelFieldById = _quickElasticSearch.UpdateModelFieldsById<TestElasticSearchModel>(342235158519882, new { UserAge = 32, Money = 66.66 });
  5.  
     
  6.  
    //异步
  7.  
    var retUpdateModelFieldByIdAsync = await _quickElasticSearch.UpdateModelFieldsByIdAsync<TestElasticSearchModel>(342235158519882, new { UserAge = 32, Money = 66.66 });

使用示例(修改数据-根据查询条件修改一个或多个字段的值):

  1.  
    //类似SQL:UPDATE A SET col1=123,col2=456 WHERE (Id=1 OR Id=2)
  2.  
    //定义查询条件:(Id = 342235158519882 OR Id = 342235158519883)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,
  7.  
    EsQueryType.Or,
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id = 342235158519882 OR Id = 342235158519883)
  11.  
    queryCon
  12.  
    .AddEqu(m => m.Id, 342235158519882)
  13.  
    .AddEqu(m => m.Id, 342235158519883);
  14.  
    });
  15.  
     
  16.  
    //异步
  17.  
    var retUpdateModelFieldsByCon = _quickElasticSearch.UpdateModelFieldsByCon<TestElasticSearchModel>(queryCon, new { UserAge = 13, Money = 996.33 });
  18.  
     
  19.  
    //同步
  20.  
    var retUpdateModelFieldsByConAsync = await _quickElasticSearch.UpdateModelFieldsByConAsync<TestElasticSearchModel>(queryCon, new { UserAge = 14, Money = 997.44 });
学新通

使用示例(修改数据-单条):

  1.  
    var rand = new Random(Guid.NewGuid().GetHashCode());
  2.  
    var testData = new TestElasticSearchModel
  3.  
    {
  4.  
    Id = 1,
  5.  
    UserId = rand.Next(1, 9999),
  6.  
    UserName = "Quber1",
  7.  
    UserAge = rand.Next(20, 80),
  8.  
    Money = (float)2.429,
  9.  
    MoneyOth = (float)3.556,
  10.  
    CreateTime = DateTime.Now
  11.  
    };
  12.  
    var testDataAsync = new TestElasticSearchModel
  13.  
    {
  14.  
    Id = 3,
  15.  
    UserId = rand.Next(1, 9999),
  16.  
    UserName = "Jack1",
  17.  
    UserAge = rand.Next(20, 80),
  18.  
    Money = (float)2.429,
  19.  
    MoneyOth = (float)3.556,
  20.  
    CreateTime = DateTime.Now
  21.  
    };
  22.  
     
  23.  
    //同步
  24.  
    var retUpdateModel = _quickElasticSearch.UpdateModel(testData);
  25.  
     
  26.  
    //异步
  27.  
    var retUpdateModelAsync = await _quickElasticSearch.UpdateModelAsync(testDataAsync);
学新通

使用示例(修改数据-多条):

  1.  
    var rand = new Random(Guid.NewGuid().GetHashCode());
  2.  
    var testDatas = new List<TestElasticSearchModel>
  3.  
    {
  4.  
    new TestElasticSearchModel
  5.  
    {
  6.  
    Id = 1,
  7.  
    UserId = rand.Next(1, 9999),
  8.  
    UserName = "Quber1",
  9.  
    UserAge = rand.Next(20, 80),
  10.  
    Money = (float)2.429,
  11.  
    MoneyOth = (float)3.556,
  12.  
    CreateTime = DateTime.Now
  13.  
    },
  14.  
    new TestElasticSearchModel
  15.  
    {
  16.  
    Id = 3,
  17.  
    UserId = rand.Next(1, 9999),
  18.  
    UserName = "Jack1",
  19.  
    UserAge = rand.Next(20, 80),
  20.  
    Money = (float)2.429,
  21.  
    MoneyOth = (float)3.556,
  22.  
    CreateTime = DateTime.Now
  23.  
    },
  24.  
    new TestElasticSearchModel
  25.  
    {
  26.  
    Id = 4,
  27.  
    UserId = rand.Next(1, 9999),
  28.  
    UserName = "Jack1",
  29.  
    UserAge = rand.Next(20, 80),
  30.  
    Money = (float)2.429,
  31.  
    MoneyOth = (float)3.556,
  32.  
    CreateTime = DateTime.Now
  33.  
    }
  34.  
    };
  35.  
     
  36.  
    //同步
  37.  
    var retUpdateModels = _quickElasticSearch.UpdateModels(testDatas, (errList, errMsg, allList) =>
  38.  
    {
  39.  
    var thisErrList = errList;
  40.  
    var thisErrMsg = errMsg;
  41.  
    });
  42.  
     
  43.  
    //异步
  44.  
    var retUpdateModelsAsync = await _quickElasticSearch.UpdateModelsAsync(testDatas, async (errList, errMsg, allList) =>
  45.  
    {
  46.  
    var thisErrList = errList;
  47.  
    var thisErrMsg = errMsg;
  48.  
     
  49.  
    await Task.CompletedTask;
  50.  
    });
学新通

5.7、🥘 删除数据

使用示例(删除数据-根据 Id):

  1.  
    //同步
  2.  
    var retDeleteModel = _quickElasticSearch.DeleteModel<TestElasticSearchModel>(340504986927178);
  3.  
     
  4.  
    //异步
  5.  
    var retDeleteModelAsync = await _quickElasticSearch.DeleteModelAsync<TestElasticSearchModel>(340504986927176);

使用示例(删除数据-根据条件):

  1.  
    //定义查询条件:(Id >= 340506710462542 AND UserAge <= 60) OR (Id = 340506710462539 OR Id = 340506710462538)
  2.  
    var queryCon = QuickElasticSearchExtension
  3.  
    //创建条件(默认创建了一个组合条件)
  4.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  5.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  6.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  7.  
    (queryCon) =>
  8.  
    {
  9.  
    //查询条件:(Id >= 340506710462542 AND UserAge <= 60)
  10.  
    queryCon
  11.  
    .AddGte(m => m.Id, 340506710462542)
  12.  
    .AddLte(m => m.UserAge, 60);
  13.  
    })
  14.  
    //添加另一个组合条件
  15.  
    .AddEsQueryModel(
  16.  
    EsQueryType.Or,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  17.  
    EsQueryType.Or,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  18.  
    (queryCon) =>
  19.  
    {
  20.  
    //查询条件:(Id = 340506710462539 OR Id = 340506710462538)
  21.  
    queryCon
  22.  
    .AddEqu(m => m.Id, 340506710462539)
  23.  
    .AddEqu(m => m.Id, 340506710462538);
  24.  
    });
  25.  
     
  26.  
    //同步
  27.  
    var retDeleteModelBy = _quickElasticSearch.DeleteModelBy<TestElasticSearchModel>(queryCon);
  28.  
     
  29.  
    //异步
  30.  
    var retDeleteModelByAsync = await _quickElasticSearch.DeleteModelByAsync<TestElasticSearchModel>(queryCon);
学新通

5.8、🍲 获取数据

使用示例(获取所有数据):

  1.  
    //排序条件:ORDER BY Id DESC
  2.  
     
  3.  
    //同步
  4.  
    var retGetModelsAll = _quickElasticSearch.GetModelsAll<TestElasticSearchModel>(m => m.Id, true);
  5.  
     
  6.  
    //异步
  7.  
    var retGetModelsAllAsync = await _quickElasticSearch.GetModelsAllAsync<TestElasticSearchModel>(m => m.CreateTime, false);
  1.  
    # 获取所有数据
  2.  
    # 类似SQL:SELECT TOP 2000000000 * FROM A ORDER BY CreateTime DESC
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "from":0,
  7.  
    "query":{
  8.  
    "match_all":{
  9.  
     
  10.  
    }
  11.  
    },
  12.  
    "size":2000000000,
  13.  
    "sort":[
  14.  
    {
  15.  
    "CreateTime":{
  16.  
    "order":"asc"
  17.  
    }
  18.  
    }
  19.  
    ]
  20.  
    }
学新通
  1.  
    {
  2.  
    "took": 8,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362545766476",
  21.  
    "_score": null,
  22.  
    "_source": {
  23.  
    "Id": 343362545766476,
  24.  
    "UserType": "高级用户",
  25.  
    "UserId": 5133,
  26.  
    "UserName": "Quber9",
  27.  
    "UserAge": 63,
  28.  
    "Money": 9.429,
  29.  
    "MoneyOth": 10.556,
  30.  
    "CreateTime": "2022-10-17T16:05:48.5451264 08:00"
  31.  
    },
  32.  
    "sort": [1665993948545]
  33.  
    },
  34.  
    {
  35.  
    "_index": "test_index",
  36.  
    "_type": "_doc",
  37.  
    "_id": "343362545766473",
  38.  
    "_score": null,
  39.  
    "_source": {
  40.  
    "Id": 343362545766473,
  41.  
    "UserType": "系统用户",
  42.  
    "UserId": 7360,
  43.  
    "UserName": "Quber6",
  44.  
    "UserAge": 57,
  45.  
    "Money": 6.429,
  46.  
    "MoneyOth": 7.5559998,
  47.  
    "CreateTime": "2022-10-17T16:05:48.5451259 08:00"
  48.  
    },
  49.  
    "sort": [1665993948545]
  50.  
    }
  51.  
    ……
  52.  
    ]
  53.  
    }
  54.  
    }
学新通

使用示例(获取匹配条件的所有数据):

  1.  
    //排序条件:ORDER BY Id DESC
  2.  
    //定义查询条件:(Id >= 340506710462535 AND UserAge <= 70)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 340506710462535 AND UserAge <= 70)
  11.  
    queryCon
  12.  
    .AddGte(m => m.Id, 340506710462535)
  13.  
    .AddLte(m => m.UserAge, 70);
  14.  
    });
  15.  
     
  16.  
    //同步
  17.  
    var retGetModels = _quickElasticSearch.GetModels<TestElasticSearchModel>(m => m.Id, true, queryCon);
  18.  
     
  19.  
    //异步
  20.  
    var retGetModelsAsync = await _quickElasticSearch.GetModelsAsync<TestElasticSearchModel>(m => m.Id, true, queryCon);
学新通
  1.  
    # 获取匹配条件的所有数据
  2.  
    # 类似SQL:SELECT TOP 2000000000 * FROM A WHERE Id >= 340506710462535 AND UserAge <= 70 ORDER BY Id DESC
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "from":0,
  7.  
    "query":{
  8.  
    "bool":{
  9.  
    "must":[
  10.  
    {
  11.  
    "range":{
  12.  
    "Id":{
  13.  
    "gte":340506710462535
  14.  
    }
  15.  
    }
  16.  
    },
  17.  
    {
  18.  
    "range":{
  19.  
    "UserAge":{
  20.  
    "lte":70
  21.  
    }
  22.  
    }
  23.  
    }
  24.  
    ]
  25.  
    }
  26.  
    },
  27.  
    "size":2000000000,
  28.  
    "sort":[
  29.  
    {
  30.  
    "Id":{
  31.  
    "order":"desc"
  32.  
    }
  33.  
    }
  34.  
    ]
  35.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 65,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362866188366",
  21.  
    "_score": null,
  22.  
    "_source": {
  23.  
    "Id": 343362866188366,
  24.  
    "UserType": "会员用户",
  25.  
    "UserId": 2106,
  26.  
    "UserName": "Quber10",
  27.  
    "UserAge": 30,
  28.  
    "Money": 10.429,
  29.  
    "MoneyOth": 11.556,
  30.  
    "CreateTime": "2022-10-17T16:07:06.7733297 08:00"
  31.  
    },
  32.  
    "sort": [343362866188366]
  33.  
    },
  34.  
    {
  35.  
    "_index": "test_index",
  36.  
    "_type": "_doc",
  37.  
    "_id": "343362866188365",
  38.  
    "_score": null,
  39.  
    "_source": {
  40.  
    "Id": 343362866188365,
  41.  
    "UserType": "系统用户",
  42.  
    "UserId": 829,
  43.  
    "UserName": "Quber9",
  44.  
    "UserAge": 39,
  45.  
    "Money": 9.429,
  46.  
    "MoneyOth": 10.556,
  47.  
    "CreateTime": "2022-10-17T16:07:06.7733294 08:00"
  48.  
    },
  49.  
    "sort": [343362866188365]
  50.  
    },
  51.  
    ……
  52.  
    ]
  53.  
    }
  54.  
    }
学新通

使用示例(获取匹配条件的所有数据(返回指定字段的值)):

  1.  
    //排序条件:ORDER BY Id DESC
  2.  
    //定义查询条件:(Id >= 340506710462535 AND UserAge <= 70)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 340506710462535 AND UserAge <= 70)
  11.  
    queryCon
  12.  
    .AddGte(m => m.Id, 340506710462535)
  13.  
    .AddLte(m => m.UserAge, 70);
  14.  
    });
  15.  
     
  16.  
    //同步
  17.  
    var retGetModelsFields = _quickElasticSearch.GetModelsFields<TestElasticSearchModel>(new List<string> { "UserId", "UserName", "UserAge" }, m => m.Id, true, queryCon);
  18.  
     
  19.  
    //异步
  20.  
    var retGetModelsFieldsAsync = await _quickElasticSearch.GetModelsFieldsAsync<TestElasticSearchModel>(new List<string> { "UserId", "UserName", "UserAge" }, m => m.Id, true, queryCon);
学新通
  1.  
    # 获取匹配条件的所有数据(返回指定字段的值)
  2.  
    # 类似SQL:SELECT TOP 2000000000 'UserId','UserName','UserAge' FROM A WHERE Id >= 340506710462535 AND UserAge <= 70 ORDER BY Id DESC
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "from":0,
  7.  
    "query":{
  8.  
    "bool":{
  9.  
    "must":[
  10.  
    {
  11.  
    "range":{
  12.  
    "Id":{
  13.  
    "gte":340506710462535
  14.  
    }
  15.  
    }
  16.  
    },
  17.  
    {
  18.  
    "range":{
  19.  
    "UserAge":{
  20.  
    "lte":70
  21.  
    }
  22.  
    }
  23.  
    }
  24.  
    ]
  25.  
    }
  26.  
    },
  27.  
    "size":2000000000,
  28.  
    "sort":[
  29.  
    {
  30.  
    "Id":{
  31.  
    "order":"desc"
  32.  
    }
  33.  
    }
  34.  
    ],
  35.  
    "_source":{
  36.  
    "includes":[
  37.  
    "UserId",
  38.  
    "UserName",
  39.  
    "UserAge"
  40.  
    ]
  41.  
    }
  42.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 65,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362866188366",
  21.  
    "_score": null,
  22.  
    "_source": {
  23.  
    "UserName": "Quber10",
  24.  
    "UserId": 2106,
  25.  
    "UserAge": 30
  26.  
    },
  27.  
    "sort": [343362866188366]
  28.  
    },
  29.  
    {
  30.  
    "_index": "test_index",
  31.  
    "_type": "_doc",
  32.  
    "_id": "343362866188365",
  33.  
    "_score": null,
  34.  
    "_source": {
  35.  
    "UserName": "Quber9",
  36.  
    "UserId": 829,
  37.  
    "UserAge": 39
  38.  
    },
  39.  
    "sort": [343362866188365]
  40.  
    }
  41.  
    ……
  42.  
    ]
  43.  
    }
  44.  
    }
学新通

使用示例(获取一条数据-根据主键 Id 查询):

  1.  
    //同步
  2.  
    var retGetModel = _quickElasticSearch.GetModel<TestElasticSearchModel>(342235158519882);
  3.  
     
  4.  
    //异步
  5.  
    var retGetModelAsync = await _quickElasticSearch.GetModelAsync<TestElasticSearchModel>(342235158519883);
  1.  
    # 获取一条数据(根据主键Id查询)
  2.  
    # 类似SQL:SELECT * FROM A WHERE Id = 343362866188364
  3.  
    GET /test_index/_doc/343362866188364
  1.  
    {
  2.  
    "_index": "test_index",
  3.  
    "_type": "_doc",
  4.  
    "_id": "343362866188364",
  5.  
    "_version": 1,
  6.  
    "_seq_no": 14,
  7.  
    "_primary_term": 1,
  8.  
    "found": true,
  9.  
    "_source": {
  10.  
    "Id": 343362866188364,
  11.  
    "UserType": "高级用户",
  12.  
    "UserId": 7438,
  13.  
    "UserName": "Quber8",
  14.  
    "UserAge": 53,
  15.  
    "Money": 8.429,
  16.  
    "MoneyOth": 9.556,
  17.  
    "CreateTime": "2022-10-17T16:07:06.7733293 08:00"
  18.  
    }
  19.  
    }
学新通

使用示例(获取一条数据-根据某字段查询):

  1.  
    //同步
  2.  
    var retGetModel = _quickElasticSearch.GetModel<TestElasticSearchModel>(m => m.UserId, 340506710462542);
  3.  
     
  4.  
    //异步
  5.  
    var retGetModelAsync = await _quickElasticSearch.GetModelAsync<TestElasticSearchModel>(m => m.UserId, 340506710462537);
  1.  
    # 获取一条数据(根据某字段查询)
  2.  
    # 类似SQL:SELECT * FROM A WHERE UserId = 7438
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "query":{
  7.  
    "term":{
  8.  
    "UserId":{
  9.  
    "value":7438
  10.  
    }
  11.  
    }
  12.  
    }
  13.  
    }
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 1,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": 1.0,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362866188364",
  21.  
    "_score": 1.0,
  22.  
    "_source": {
  23.  
    "Id": 343362866188364,
  24.  
    "UserType": "高级用户",
  25.  
    "UserId": 7438,
  26.  
    "UserName": "Quber8",
  27.  
    "UserAge": 53,
  28.  
    "Money": 8.429,
  29.  
    "MoneyOth": 9.556,
  30.  
    "CreateTime": "2022-10-17T16:07:06.7733293 08:00"
  31.  
    }
  32.  
    }
  33.  
    ]
  34.  
    }
  35.  
    }
学新通

使用示例(获取分页数据):

  1.  
    //分页条件
  2.  
    var pagerCon = new EsPagerConModel
  3.  
    {
  4.  
    PageIndex = 1,
  5.  
    PageSize = 15,
  6.  
    OrderField = "Id",
  7.  
    OrderType = "desc"
  8.  
    };
  9.  
    //定义查询条件:(Id >= 1)
  10.  
    var queryCon = QuickElasticSearchExtension
  11.  
    //创建条件(默认创建了一个组合条件)
  12.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  13.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  14.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  15.  
    (queryCon) =>
  16.  
    {
  17.  
    //查询条件:(Id >= 1)
  18.  
    queryCon.AddGte(m => m.Id, 1);
  19.  
    });
  20.  
     
  21.  
    //同步
  22.  
    var retGetPager = _quickElasticSearch.GetPager<TestElasticSearchModel>(pagerCon, queryCon);
  23.  
     
  24.  
    //异步
  25.  
    var retGetPagerAsync = await _quickElasticSearch.GetPagerAsync<TestElasticSearchModel>(pagerCon, queryCon);
学新通
  1.  
    # 获取分页数据
  2.  
    # 类似SQL:SELECT * FROM A WHERE Id >= 1 LIMIT 0,15 ORDER BY Id DESC
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "from":0,
  7.  
    "query":{
  8.  
    "bool":{
  9.  
    "must":[
  10.  
    {
  11.  
    "range":{
  12.  
    "Id":{
  13.  
    "gte":1
  14.  
    }
  15.  
    }
  16.  
    }
  17.  
    ]
  18.  
    }
  19.  
    },
  20.  
    "size":15,
  21.  
    "sort":[
  22.  
    {
  23.  
    "Id":{
  24.  
    "order":"desc"
  25.  
    }
  26.  
    }
  27.  
    ]
  28.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362866188366",
  21.  
    "_score": null,
  22.  
    "_source": {
  23.  
    "Id": 343362866188366,
  24.  
    "UserType": "会员用户",
  25.  
    "UserId": 2106,
  26.  
    "UserName": "Quber10",
  27.  
    "UserAge": 30,
  28.  
    "Money": 10.429,
  29.  
    "MoneyOth": 11.556,
  30.  
    "CreateTime": "2022-10-17T16:07:06.7733297 08:00"
  31.  
    },
  32.  
    "sort": [343362866188366]
  33.  
    },
  34.  
    {
  35.  
    "_index": "test_index",
  36.  
    "_type": "_doc",
  37.  
    "_id": "343362866188365",
  38.  
    "_score": null,
  39.  
    "_source": {
  40.  
    "Id": 343362866188365,
  41.  
    "UserType": "系统用户",
  42.  
    "UserId": 829,
  43.  
    "UserName": "Quber9",
  44.  
    "UserAge": 39,
  45.  
    "Money": 9.429,
  46.  
    "MoneyOth": 10.556,
  47.  
    "CreateTime": "2022-10-17T16:07:06.7733294 08:00"
  48.  
    },
  49.  
    "sort": [343362866188365]
  50.  
    }
  51.  
    ……
  52.  
    ]
  53.  
    }
  54.  
    }
学新通

使用示例(获取分页数据-返回指定字段的值):

  1.  
    //分页条件
  2.  
    var pagerCon = new EsPagerConModel
  3.  
    {
  4.  
    PageIndex = 1,
  5.  
    PageSize = 15,
  6.  
    OrderField = "Id",
  7.  
    OrderType = "desc"
  8.  
    };
  9.  
    //定义查询条件:(Id >= 1)
  10.  
    var queryCon = QuickElasticSearchExtension
  11.  
    //创建条件(默认创建了一个组合条件)
  12.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  13.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  14.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  15.  
    (queryCon) =>
  16.  
    {
  17.  
    //查询条件:(Id >= 1)
  18.  
    queryCon.AddGte(m => m.Id, 1);
  19.  
    });
  20.  
     
  21.  
    //同步
  22.  
    var retGetPagerFields = _quickElasticSearch.GetPagerFields<TestElasticSearchModel>(pagerCon, new List<string> { "UserId", "UserName", "UserAge" }, queryCon);
  23.  
     
  24.  
    //异步
  25.  
    var retGetPagerFieldsAsync = await _quickElasticSearch.GetPagerFieldsAsync<TestElasticSearchModel>(pagerCon, new List<string> { "UserId", "UserName", "UserAge" }, queryCon);
学新通
  1.  
    # 获取分页数据(返回指定字段的值)
  2.  
    # 类似SQL:SELECT 'UserId','UserName','UserAge' FROM A WHERE Id >= 1 LIMIT 0,15 ORDER BY Id DESC
  3.  
    POST /test_index/_search?typed_keys=true
  4.  
    {
  5.  
    "track_total_hits":true,
  6.  
    "from":0,
  7.  
    "query":{
  8.  
    "bool":{
  9.  
    "must":[
  10.  
    {
  11.  
    "range":{
  12.  
    "Id":{
  13.  
    "gte":1
  14.  
    }
  15.  
    }
  16.  
    }
  17.  
    ]
  18.  
    }
  19.  
    },
  20.  
    "size":15,
  21.  
    "sort":[
  22.  
    {
  23.  
    "Id":{
  24.  
    "order":"desc"
  25.  
    }
  26.  
    }
  27.  
    ],
  28.  
    "_source":{
  29.  
    "includes":[
  30.  
    "UserId",
  31.  
    "UserName",
  32.  
    "UserAge"
  33.  
    ]
  34.  
    }
  35.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": [
  17.  
    {
  18.  
    "_index": "test_index",
  19.  
    "_type": "_doc",
  20.  
    "_id": "343362866188366",
  21.  
    "_score": null,
  22.  
    "_source": {
  23.  
    "UserName": "Quber10",
  24.  
    "UserId": 2106,
  25.  
    "UserAge": 30
  26.  
    },
  27.  
    "sort": [343362866188366]
  28.  
    },
  29.  
    {
  30.  
    "_index": "test_index",
  31.  
    "_type": "_doc",
  32.  
    "_id": "343362866188365",
  33.  
    "_score": null,
  34.  
    "_source": {
  35.  
    "UserName": "Quber9",
  36.  
    "UserId": 829,
  37.  
    "UserAge": 39
  38.  
    },
  39.  
    "sort": [343362866188365]
  40.  
    }
  41.  
    ……
  42.  
    ]
  43.  
    }
  44.  
    }
学新通

5.9、🥣 分组统计查询

使用示例(单个字段分组,并返回该字段的所有值集合):

  1.  
    //类似SQL:SELECT col1 FROM A GROUP BY col1
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupValues = _quickElasticSearch.GetGroupValues<TestElasticSearchModel>(m => m.UserName, queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupValuesAsync = await _quickElasticSearch.GetGroupValuesAsync<TestElasticSearchModel>(m => m.UserName, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": ["Jack1", "Jack2", "Jack3"]
  5.  
    }
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "terms":{
  7.  
    "field":"UserName",
  8.  
    "order":[
  9.  
    {
  10.  
    "_key":"asc"
  11.  
    }
  12.  
    ],
  13.  
    "size":2000000000
  14.  
    }
  15.  
    }
  16.  
    },
  17.  
    "query":{
  18.  
    "bool":{
  19.  
    "must":[
  20.  
    {
  21.  
    "range":{
  22.  
    "Id":{
  23.  
    "gte":1
  24.  
    }
  25.  
    }
  26.  
    }
  27.  
    ]
  28.  
    }
  29.  
    },
  30.  
    "size":0
  31.  
    }
学新通
  1.  
    {
  2.  
    "took": 2,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "sterms#StatiGroup": {
  20.  
    "doc_count_error_upper_bound": 0,
  21.  
    "sum_other_doc_count": 0,
  22.  
    "buckets": [
  23.  
    {
  24.  
    "key": "Jack1",
  25.  
    "doc_count": 2
  26.  
    },
  27.  
    {
  28.  
    "key": "Jack10",
  29.  
    "doc_count": 1
  30.  
    },
  31.  
    {
  32.  
    "key": "Jack2",
  33.  
    "doc_count": 2
  34.  
    },
  35.  
    {
  36.  
    "key": "Jack3",
  37.  
    "doc_count": 2
  38.  
    },
  39.  
    {
  40.  
    "key": "Jack4",
  41.  
    "doc_count": 2
  42.  
    },
  43.  
    {
  44.  
    "key": "Jack5",
  45.  
    "doc_count": 2
  46.  
    },
  47.  
    {
  48.  
    "key": "Jack6",
  49.  
    "doc_count": 1
  50.  
    },
  51.  
    {
  52.  
    "key": "Jack7",
  53.  
    "doc_count": 1
  54.  
    },
  55.  
    {
  56.  
    "key": "Jack8",
  57.  
    "doc_count": 1
  58.  
    },
  59.  
    {
  60.  
    "key": "Jack9",
  61.  
    "doc_count": 1
  62.  
    },
  63.  
    {
  64.  
    "key": "Quber1",
  65.  
    "doc_count": 7
  66.  
    },
  67.  
    {
  68.  
    "key": "Quber10",
  69.  
    "doc_count": 3
  70.  
    },
  71.  
    {
  72.  
    "key": "Quber11",
  73.  
    "doc_count": 1
  74.  
    },
  75.  
    {
  76.  
    "key": "Quber12",
  77.  
    "doc_count": 1
  78.  
    },
  79.  
    {
  80.  
    "key": "Quber2",
  81.  
    "doc_count": 7
  82.  
    },
  83.  
    {
  84.  
    "key": "Quber3",
  85.  
    "doc_count": 7
  86.  
    },
  87.  
    {
  88.  
    "key": "Quber4",
  89.  
    "doc_count": 7
  90.  
    },
  91.  
    {
  92.  
    "key": "Quber5",
  93.  
    "doc_count": 7
  94.  
    },
  95.  
    {
  96.  
    "key": "Quber6",
  97.  
    "doc_count": 6
  98.  
    },
  99.  
    {
  100.  
    "key": "Quber7",
  101.  
    "doc_count": 5
  102.  
    },
  103.  
    {
  104.  
    "key": "Quber8",
  105.  
    "doc_count": 5
  106.  
    },
  107.  
    {
  108.  
    "key": "Quber9",
  109.  
    "doc_count": 4
  110.  
    }
  111.  
    ]
  112.  
    }
  113.  
    }
  114.  
    }
学新通

使用示例(单个字段分组,并返回该字段的所有值和数量集合):

  1.  
    //类似SQL:SELECT col1,COUNT(1) FROM A GROUP BY col1
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupCount = _quickElasticSearch.GetGroupCount<TestElasticSearchModel>(m => m.UserName, queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupCountAsync = await _quickElasticSearch.GetGroupCountAsync<TestElasticSearchModel>(m => m.UserName, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "Jack1",
  7.  
    "Count": 2
  8.  
    },
  9.  
    {
  10.  
    "Name": "Jack2",
  11.  
    "Count": 2
  12.  
    },
  13.  
    {
  14.  
    "Name": "Jack3",
  15.  
    "Count": 2
  16.  
    }
  17.  
    ]
  18.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "terms":{
  7.  
    "field":"UserName",
  8.  
    "order":[
  9.  
    {
  10.  
    "_key":"asc"
  11.  
    },
  12.  
    {
  13.  
    "_count":"asc"
  14.  
    }
  15.  
    ],
  16.  
    "size":2000000000
  17.  
    }
  18.  
    }
  19.  
    },
  20.  
    "query":{
  21.  
    "bool":{
  22.  
    "must":[
  23.  
    {
  24.  
    "range":{
  25.  
    "Id":{
  26.  
    "gte":1
  27.  
    }
  28.  
    }
  29.  
    }
  30.  
    ]
  31.  
    }
  32.  
    },
  33.  
    "size":0
  34.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "sterms#StatiGroup": {
  20.  
    "doc_count_error_upper_bound": 0,
  21.  
    "sum_other_doc_count": 0,
  22.  
    "buckets": [
  23.  
    {
  24.  
    "key": "Jack1",
  25.  
    "doc_count": 2
  26.  
    },
  27.  
    {
  28.  
    "key": "Jack10",
  29.  
    "doc_count": 1
  30.  
    },
  31.  
    {
  32.  
    "key": "Jack2",
  33.  
    "doc_count": 2
  34.  
    },
  35.  
    {
  36.  
    "key": "Jack3",
  37.  
    "doc_count": 2
  38.  
    },
  39.  
    {
  40.  
    "key": "Jack4",
  41.  
    "doc_count": 2
  42.  
    },
  43.  
    {
  44.  
    "key": "Jack5",
  45.  
    "doc_count": 2
  46.  
    },
  47.  
    {
  48.  
    "key": "Jack6",
  49.  
    "doc_count": 1
  50.  
    },
  51.  
    {
  52.  
    "key": "Jack7",
  53.  
    "doc_count": 1
  54.  
    },
  55.  
    {
  56.  
    "key": "Jack8",
  57.  
    "doc_count": 1
  58.  
    },
  59.  
    {
  60.  
    "key": "Jack9",
  61.  
    "doc_count": 1
  62.  
    },
  63.  
    {
  64.  
    "key": "Quber1",
  65.  
    "doc_count": 7
  66.  
    },
  67.  
    {
  68.  
    "key": "Quber10",
  69.  
    "doc_count": 3
  70.  
    },
  71.  
    {
  72.  
    "key": "Quber11",
  73.  
    "doc_count": 1
  74.  
    },
  75.  
    {
  76.  
    "key": "Quber12",
  77.  
    "doc_count": 1
  78.  
    },
  79.  
    {
  80.  
    "key": "Quber2",
  81.  
    "doc_count": 7
  82.  
    },
  83.  
    {
  84.  
    "key": "Quber3",
  85.  
    "doc_count": 7
  86.  
    },
  87.  
    {
  88.  
    "key": "Quber4",
  89.  
    "doc_count": 7
  90.  
    },
  91.  
    {
  92.  
    "key": "Quber5",
  93.  
    "doc_count": 7
  94.  
    },
  95.  
    {
  96.  
    "key": "Quber6",
  97.  
    "doc_count": 6
  98.  
    },
  99.  
    {
  100.  
    "key": "Quber7",
  101.  
    "doc_count": 5
  102.  
    },
  103.  
    {
  104.  
    "key": "Quber8",
  105.  
    "doc_count": 5
  106.  
    },
  107.  
    {
  108.  
    "key": "Quber9",
  109.  
    "doc_count": 4
  110.  
    }
  111.  
    ]
  112.  
    }
  113.  
    }
  114.  
    }
学新通

使用示例(单个字段分组,并返回另一个字段的总和、最大值、最小值和平均值):

  1.  
    //类似SQL:SELECT col1,COUNT(1),SUM(col2),MAX(col2),MIN(col2),AVG(col2) FROM A GROUP BY col1
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupCountSmma = _quickElasticSearch.GetGroupCountSmma<TestElasticSearchModel>(m => m.UserName, m => m.UserAge, queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupCountSmmaAsync = await _quickElasticSearch.GetGroupCountSmmaAsync<TestElasticSearchModel>(m => m.UserName, m => m.UserAge, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "Jack1",
  7.  
    "Count": 2,
  8.  
    "Sum": 54,
  9.  
    "Max": 31,
  10.  
    "Min": 23,
  11.  
    "Avg": 27
  12.  
    },
  13.  
    {
  14.  
    "Name": "Jack2",
  15.  
    "Count": 2,
  16.  
    "Sum": 98,
  17.  
    "Max": 77,
  18.  
    "Min": 21,
  19.  
    "Avg": 49
  20.  
    },
  21.  
    {
  22.  
    "Name": "Jack3",
  23.  
    "Count": 2,
  24.  
    "Sum": 126,
  25.  
    "Max": 67,
  26.  
    "Min": 59,
  27.  
    "Avg": 63
  28.  
    }
  29.  
    ]
  30.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiSum":{
  8.  
    "sum":{
  9.  
    "field":"UserAge"
  10.  
    }
  11.  
    },
  12.  
    "StatiMax":{
  13.  
    "max":{
  14.  
    "field":"UserAge"
  15.  
    }
  16.  
    },
  17.  
    "StatiMin":{
  18.  
    "min":{
  19.  
    "field":"UserAge"
  20.  
    }
  21.  
    },
  22.  
    "StatiAvg":{
  23.  
    "avg":{
  24.  
    "field":"UserAge"
  25.  
    }
  26.  
    }
  27.  
    },
  28.  
    "terms":{
  29.  
    "field":"UserName",
  30.  
    "order":[
  31.  
    {
  32.  
    "_key":"asc"
  33.  
    },
  34.  
    {
  35.  
    "_count":"asc"
  36.  
    }
  37.  
    ],
  38.  
    "size":2000000000
  39.  
    }
  40.  
    }
  41.  
    },
  42.  
    "query":{
  43.  
    "bool":{
  44.  
    "must":[
  45.  
    {
  46.  
    "range":{
  47.  
    "Id":{
  48.  
    "gte":1
  49.  
    }
  50.  
    }
  51.  
    }
  52.  
    ]
  53.  
    }
  54.  
    },
  55.  
    "size":0
  56.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "sterms#StatiGroup": {
  20.  
    "doc_count_error_upper_bound": 0,
  21.  
    "sum_other_doc_count": 0,
  22.  
    "buckets": [
  23.  
    {
  24.  
    "key": "Jack1",
  25.  
    "doc_count": 2,
  26.  
    "avg#StatiAvg": {
  27.  
    "value": 34.0
  28.  
    },
  29.  
    "max#StatiMax": {
  30.  
    "value": 39.0
  31.  
    },
  32.  
    "min#StatiMin": {
  33.  
    "value": 29.0
  34.  
    },
  35.  
    "sum#StatiSum": {
  36.  
    "value": 68.0
  37.  
    }
  38.  
    },
  39.  
    {
  40.  
    "key": "Jack10",
  41.  
    "doc_count": 1,
  42.  
    "avg#StatiAvg": {
  43.  
    "value": 60.0
  44.  
    },
  45.  
    "max#StatiMax": {
  46.  
    "value": 60.0
  47.  
    },
  48.  
    "min#StatiMin": {
  49.  
    "value": 60.0
  50.  
    },
  51.  
    "sum#StatiSum": {
  52.  
    "value": 60.0
  53.  
    }
  54.  
    },
  55.  
    {
  56.  
    "key": "Jack2",
  57.  
    "doc_count": 2,
  58.  
    "avg#StatiAvg": {
  59.  
    "value": 40.0
  60.  
    },
  61.  
    "max#StatiMax": {
  62.  
    "value": 48.0
  63.  
    },
  64.  
    "min#StatiMin": {
  65.  
    "value": 32.0
  66.  
    },
  67.  
    "sum#StatiSum": {
  68.  
    "value": 80.0
  69.  
    }
  70.  
    },
  71.  
    {
  72.  
    "key": "Jack3",
  73.  
    "doc_count": 2,
  74.  
    "avg#StatiAvg": {
  75.  
    "value": 39.5
  76.  
    },
  77.  
    "max#StatiMax": {
  78.  
    "value": 53.0
  79.  
    },
  80.  
    "min#StatiMin": {
  81.  
    "value": 26.0
  82.  
    },
  83.  
    "sum#StatiSum": {
  84.  
    "value": 79.0
  85.  
    }
  86.  
    },
  87.  
    {
  88.  
    "key": "Jack4",
  89.  
    "doc_count": 2,
  90.  
    "avg#StatiAvg": {
  91.  
    "value": 48.0
  92.  
    },
  93.  
    "max#StatiMax": {
  94.  
    "value": 65.0
  95.  
    },
  96.  
    "min#StatiMin": {
  97.  
    "value": 31.0
  98.  
    },
  99.  
    "sum#StatiSum": {
  100.  
    "value": 96.0
  101.  
    }
  102.  
    },
  103.  
    {
  104.  
    "key": "Jack5",
  105.  
    "doc_count": 2,
  106.  
    "avg#StatiAvg": {
  107.  
    "value": 54.0
  108.  
    },
  109.  
    "max#StatiMax": {
  110.  
    "value": 78.0
  111.  
    },
  112.  
    "min#StatiMin": {
  113.  
    "value": 30.0
  114.  
    },
  115.  
    "sum#StatiSum": {
  116.  
    "value": 108.0
  117.  
    }
  118.  
    },
  119.  
    {
  120.  
    "key": "Jack6",
  121.  
    "doc_count": 1,
  122.  
    "avg#StatiAvg": {
  123.  
    "value": 57.0
  124.  
    },
  125.  
    "max#StatiMax": {
  126.  
    "value": 57.0
  127.  
    },
  128.  
    "min#StatiMin": {
  129.  
    "value": 57.0
  130.  
    },
  131.  
    "sum#StatiSum": {
  132.  
    "value": 57.0
  133.  
    }
  134.  
    },
  135.  
    {
  136.  
    "key": "Jack7",
  137.  
    "doc_count": 1,
  138.  
    "avg#StatiAvg": {
  139.  
    "value": 40.0
  140.  
    },
  141.  
    "max#StatiMax": {
  142.  
    "value": 40.0
  143.  
    },
  144.  
    "min#StatiMin": {
  145.  
    "value": 40.0
  146.  
    },
  147.  
    "sum#StatiSum": {
  148.  
    "value": 40.0
  149.  
    }
  150.  
    },
  151.  
    {
  152.  
    "key": "Jack8",
  153.  
    "doc_count": 1,
  154.  
    "avg#StatiAvg": {
  155.  
    "value": 29.0
  156.  
    },
  157.  
    "max#StatiMax": {
  158.  
    "value": 29.0
  159.  
    },
  160.  
    "min#StatiMin": {
  161.  
    "value": 29.0
  162.  
    },
  163.  
    "sum#StatiSum": {
  164.  
    "value": 29.0
  165.  
    }
  166.  
    },
  167.  
    {
  168.  
    "key": "Jack9",
  169.  
    "doc_count": 1,
  170.  
    "avg#StatiAvg": {
  171.  
    "value": 72.0
  172.  
    },
  173.  
    "max#StatiMax": {
  174.  
    "value": 72.0
  175.  
    },
  176.  
    "min#StatiMin": {
  177.  
    "value": 72.0
  178.  
    },
  179.  
    "sum#StatiSum": {
  180.  
    "value": 72.0
  181.  
    }
  182.  
    },
  183.  
    {
  184.  
    "key": "Quber1",
  185.  
    "doc_count": 7,
  186.  
    "avg#StatiAvg": {
  187.  
    "value": 48.857142857142854
  188.  
    },
  189.  
    "max#StatiMax": {
  190.  
    "value": 79.0
  191.  
    },
  192.  
    "min#StatiMin": {
  193.  
    "value": 21.0
  194.  
    },
  195.  
    "sum#StatiSum": {
  196.  
    "value": 342.0
  197.  
    }
  198.  
    },
  199.  
    {
  200.  
    "key": "Quber10",
  201.  
    "doc_count": 3,
  202.  
    "avg#StatiAvg": {
  203.  
    "value": 31.0
  204.  
    },
  205.  
    "max#StatiMax": {
  206.  
    "value": 43.0
  207.  
    },
  208.  
    "min#StatiMin": {
  209.  
    "value": 20.0
  210.  
    },
  211.  
    "sum#StatiSum": {
  212.  
    "value": 93.0
  213.  
    }
  214.  
    },
  215.  
    {
  216.  
    "key": "Quber11",
  217.  
    "doc_count": 1,
  218.  
    "avg#StatiAvg": {
  219.  
    "value": 29.0
  220.  
    },
  221.  
    "max#StatiMax": {
  222.  
    "value": 29.0
  223.  
    },
  224.  
    "min#StatiMin": {
  225.  
    "value": 29.0
  226.  
    },
  227.  
    "sum#StatiSum": {
  228.  
    "value": 29.0
  229.  
    }
  230.  
    },
  231.  
    {
  232.  
    "key": "Quber12",
  233.  
    "doc_count": 1,
  234.  
    "avg#StatiAvg": {
  235.  
    "value": 74.0
  236.  
    },
  237.  
    "max#StatiMax": {
  238.  
    "value": 74.0
  239.  
    },
  240.  
    "min#StatiMin": {
  241.  
    "value": 74.0
  242.  
    },
  243.  
    "sum#StatiSum": {
  244.  
    "value": 74.0
  245.  
    }
  246.  
    },
  247.  
    {
  248.  
    "key": "Quber2",
  249.  
    "doc_count": 7,
  250.  
    "avg#StatiAvg": {
  251.  
    "value": 51.0
  252.  
    },
  253.  
    "max#StatiMax": {
  254.  
    "value": 78.0
  255.  
    },
  256.  
    "min#StatiMin": {
  257.  
    "value": 25.0
  258.  
    },
  259.  
    "sum#StatiSum": {
  260.  
    "value": 357.0
  261.  
    }
  262.  
    },
  263.  
    {
  264.  
    "key": "Quber3",
  265.  
    "doc_count": 7,
  266.  
    "avg#StatiAvg": {
  267.  
    "value": 48.142857142857146
  268.  
    },
  269.  
    "max#StatiMax": {
  270.  
    "value": 74.0
  271.  
    },
  272.  
    "min#StatiMin": {
  273.  
    "value": 28.0
  274.  
    },
  275.  
    "sum#StatiSum": {
  276.  
    "value": 337.0
  277.  
    }
  278.  
    },
  279.  
    {
  280.  
    "key": "Quber4",
  281.  
    "doc_count": 7,
  282.  
    "avg#StatiAvg": {
  283.  
    "value": 53.285714285714285
  284.  
    },
  285.  
    "max#StatiMax": {
  286.  
    "value": 76.0
  287.  
    },
  288.  
    "min#StatiMin": {
  289.  
    "value": 25.0
  290.  
    },
  291.  
    "sum#StatiSum": {
  292.  
    "value": 373.0
  293.  
    }
  294.  
    },
  295.  
    {
  296.  
    "key": "Quber5",
  297.  
    "doc_count": 7,
  298.  
    "avg#StatiAvg": {
  299.  
    "value": 47.285714285714285
  300.  
    },
  301.  
    "max#StatiMax": {
  302.  
    "value": 70.0
  303.  
    },
  304.  
    "min#StatiMin": {
  305.  
    "value": 25.0
  306.  
    },
  307.  
    "sum#StatiSum": {
  308.  
    "value": 331.0
  309.  
    }
  310.  
    },
  311.  
    {
  312.  
    "key": "Quber6",
  313.  
    "doc_count": 6,
  314.  
    "avg#StatiAvg": {
  315.  
    "value": 41.5
  316.  
    },
  317.  
    "max#StatiMax": {
  318.  
    "value": 78.0
  319.  
    },
  320.  
    "min#StatiMin": {
  321.  
    "value": 20.0
  322.  
    },
  323.  
    "sum#StatiSum": {
  324.  
    "value": 249.0
  325.  
    }
  326.  
    },
  327.  
    {
  328.  
    "key": "Quber7",
  329.  
    "doc_count": 5,
  330.  
    "avg#StatiAvg": {
  331.  
    "value": 43.0
  332.  
    },
  333.  
    "max#StatiMax": {
  334.  
    "value": 61.0
  335.  
    },
  336.  
    "min#StatiMin": {
  337.  
    "value": 21.0
  338.  
    },
  339.  
    "sum#StatiSum": {
  340.  
    "value": 215.0
  341.  
    }
  342.  
    },
  343.  
    {
  344.  
    "key": "Quber8",
  345.  
    "doc_count": 5,
  346.  
    "avg#StatiAvg": {
  347.  
    "value": 42.2
  348.  
    },
  349.  
    "max#StatiMax": {
  350.  
    "value": 61.0
  351.  
    },
  352.  
    "min#StatiMin": {
  353.  
    "value": 22.0
  354.  
    },
  355.  
    "sum#StatiSum": {
  356.  
    "value": 211.0
  357.  
    }
  358.  
    },
  359.  
    {
  360.  
    "key": "Quber9",
  361.  
    "doc_count": 4,
  362.  
    "avg#StatiAvg": {
  363.  
    "value": 54.75
  364.  
    },
  365.  
    "max#StatiMax": {
  366.  
    "value": 65.0
  367.  
    },
  368.  
    "min#StatiMin": {
  369.  
    "value": 39.0
  370.  
    },
  371.  
    "sum#StatiSum": {
  372.  
    "value": 219.0
  373.  
    }
  374.  
    }
  375.  
    ]
  376.  
    }
  377.  
    }
  378.  
    }
学新通

使用示例(多个字段分组,并返回多个字段对应的值以及对应分组的数据数量):

  1.  
    //类似SQL:SELECT col1,col2,COUNT(1) FROM A GROUP BY col1,col2
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupsCount = _quickElasticSearch.GetGroupsCount<TestElasticSearchModel>(new List<string> { "UserName", "UserAge" }, queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupsCountAsync = await _quickElasticSearch.GetGroupsCountAsync<TestElasticSearchModel>(new List<string> { "UserName", "UserAge" }, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "UserName": "Jack1",
  7.  
    "UserAge": 23,
  8.  
    "GroupCount": 1
  9.  
    },
  10.  
    {
  11.  
    "UserName": "Jack1",
  12.  
    "UserAge": 31,
  13.  
    "GroupCount": 1
  14.  
    },
  15.  
    {
  16.  
    "UserName": "Jack2",
  17.  
    "UserAge": 21,
  18.  
    "GroupCount": 1
  19.  
    },
  20.  
    {
  21.  
    "UserName": "Jack2",
  22.  
    "UserAge": 77,
  23.  
    "GroupCount": 1
  24.  
    },
  25.  
    {
  26.  
    "UserName": "Jack3",
  27.  
    "UserAge": 59,
  28.  
    "GroupCount": 1
  29.  
    },
  30.  
    {
  31.  
    "UserName": "Jack3",
  32.  
    "UserAge": 67,
  33.  
    "GroupCount": 1
  34.  
    }
  35.  
    ]
  36.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "multi_terms":{
  7.  
    "order":[
  8.  
    {
  9.  
    "_key":"asc"
  10.  
    },
  11.  
    {
  12.  
    "_count":"asc"
  13.  
    }
  14.  
    ],
  15.  
    "size":2000000000,
  16.  
    "terms":[
  17.  
    {
  18.  
    "field":"UserType"
  19.  
    },
  20.  
    {
  21.  
    "field":"UserName"
  22.  
    }
  23.  
    ]
  24.  
    }
  25.  
    }
  26.  
    },
  27.  
    "query":{
  28.  
    "bool":{
  29.  
    "must":[
  30.  
    {
  31.  
    "range":{
  32.  
    "Id":{
  33.  
    "gte":1
  34.  
    }
  35.  
    }
  36.  
    }
  37.  
    ]
  38.  
    }
  39.  
    },
  40.  
    "size":0
  41.  
    }
学新通
  1.  
    {
  2.  
    "took": 2,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "multi_terms#StatiGroup": {
  20.  
    "doc_count_error_upper_bound": 0,
  21.  
    "sum_other_doc_count": 0,
  22.  
    "buckets": [
  23.  
    {
  24.  
    "key": ["会员用户", "Jack1"],
  25.  
    "key_as_string": "会员用户|Jack1",
  26.  
    "doc_count": 1
  27.  
    },
  28.  
    {
  29.  
    "key": ["会员用户", "Jack6"],
  30.  
    "key_as_string": "会员用户|Jack6",
  31.  
    "doc_count": 1
  32.  
    },
  33.  
    {
  34.  
    "key": ["会员用户", "Jack9"],
  35.  
    "key_as_string": "会员用户|Jack9",
  36.  
    "doc_count": 1
  37.  
    },
  38.  
    {
  39.  
    "key": ["会员用户", "Quber1"],
  40.  
    "key_as_string": "会员用户|Quber1",
  41.  
    "doc_count": 1
  42.  
    },
  43.  
    {
  44.  
    "key": ["会员用户", "Quber10"],
  45.  
    "key_as_string": "会员用户|Quber10",
  46.  
    "doc_count": 1
  47.  
    },
  48.  
    {
  49.  
    "key": ["会员用户", "Quber11"],
  50.  
    "key_as_string": "会员用户|Quber11",
  51.  
    "doc_count": 1
  52.  
    },
  53.  
    {
  54.  
    "key": ["会员用户", "Quber2"],
  55.  
    "key_as_string": "会员用户|Quber2",
  56.  
    "doc_count": 2
  57.  
    },
  58.  
    {
  59.  
    "key": ["会员用户", "Quber3"],
  60.  
    "key_as_string": "会员用户|Quber3",
  61.  
    "doc_count": 2
  62.  
    },
  63.  
    {
  64.  
    "key": ["会员用户", "Quber4"],
  65.  
    "key_as_string": "会员用户|Quber4",
  66.  
    "doc_count": 1
  67.  
    },
  68.  
    {
  69.  
    "key": ["会员用户", "Quber5"],
  70.  
    "key_as_string": "会员用户|Quber5",
  71.  
    "doc_count": 3
  72.  
    },
  73.  
    {
  74.  
    "key": ["会员用户", "Quber6"],
  75.  
    "key_as_string": "会员用户|Quber6",
  76.  
    "doc_count": 2
  77.  
    },
  78.  
    {
  79.  
    "key": ["会员用户", "Quber7"],
  80.  
    "key_as_string": "会员用户|Quber7",
  81.  
    "doc_count": 1
  82.  
    },
  83.  
    {
  84.  
    "key": ["会员用户", "Quber8"],
  85.  
    "key_as_string": "会员用户|Quber8",
  86.  
    "doc_count": 1
  87.  
    },
  88.  
    {
  89.  
    "key": ["会员用户", "Quber9"],
  90.  
    "key_as_string": "会员用户|Quber9",
  91.  
    "doc_count": 1
  92.  
    },
  93.  
    {
  94.  
    "key": ["普通用户", "Jack1"],
  95.  
    "key_as_string": "普通用户|Jack1",
  96.  
    "doc_count": 1
  97.  
    },
  98.  
    {
  99.  
    "key": ["普通用户", "Jack10"],
  100.  
    "key_as_string": "普通用户|Jack10",
  101.  
    "doc_count": 1
  102.  
    },
  103.  
    {
  104.  
    "key": ["普通用户", "Jack2"],
  105.  
    "key_as_string": "普通用户|Jack2",
  106.  
    "doc_count": 1
  107.  
    },
  108.  
    {
  109.  
    "key": ["普通用户", "Jack4"],
  110.  
    "key_as_string": "普通用户|Jack4",
  111.  
    "doc_count": 1
  112.  
    },
  113.  
    {
  114.  
    "key": ["普通用户", "Jack7"],
  115.  
    "key_as_string": "普通用户|Jack7",
  116.  
    "doc_count": 1
  117.  
    },
  118.  
    {
  119.  
    "key": ["普通用户", "Jack8"],
  120.  
    "key_as_string": "普通用户|Jack8",
  121.  
    "doc_count": 1
  122.  
    },
  123.  
    {
  124.  
    "key": ["普通用户", "Quber1"],
  125.  
    "key_as_string": "普通用户|Quber1",
  126.  
    "doc_count": 3
  127.  
    },
  128.  
    {
  129.  
    "key": ["普通用户", "Quber12"],
  130.  
    "key_as_string": "普通用户|Quber12",
  131.  
    "doc_count": 1
  132.  
    },
  133.  
    {
  134.  
    "key": ["普通用户", "Quber3"],
  135.  
    "key_as_string": "普通用户|Quber3",
  136.  
    "doc_count": 1
  137.  
    },
  138.  
    {
  139.  
    "key": ["普通用户", "Quber4"],
  140.  
    "key_as_string": "普通用户|Quber4",
  141.  
    "doc_count": 2
  142.  
    },
  143.  
    {
  144.  
    "key": ["普通用户", "Quber6"],
  145.  
    "key_as_string": "普通用户|Quber6",
  146.  
    "doc_count": 1
  147.  
    },
  148.  
    {
  149.  
    "key": ["普通用户", "Quber7"],
  150.  
    "key_as_string": "普通用户|Quber7",
  151.  
    "doc_count": 2
  152.  
    },
  153.  
    {
  154.  
    "key": ["普通用户", "Quber8"],
  155.  
    "key_as_string": "普通用户|Quber8",
  156.  
    "doc_count": 2
  157.  
    },
  158.  
    {
  159.  
    "key": ["普通用户", "Quber9"],
  160.  
    "key_as_string": "普通用户|Quber9",
  161.  
    "doc_count": 1
  162.  
    },
  163.  
    {
  164.  
    "key": ["系统用户", "Jack2"],
  165.  
    "key_as_string": "系统用户|Jack2",
  166.  
    "doc_count": 1
  167.  
    },
  168.  
    {
  169.  
    "key": ["系统用户", "Jack3"],
  170.  
    "key_as_string": "系统用户|Jack3",
  171.  
    "doc_count": 2
  172.  
    },
  173.  
    {
  174.  
    "key": ["系统用户", "Jack5"],
  175.  
    "key_as_string": "系统用户|Jack5",
  176.  
    "doc_count": 1
  177.  
    },
  178.  
    {
  179.  
    "key": ["系统用户", "Quber1"],
  180.  
    "key_as_string": "系统用户|Quber1",
  181.  
    "doc_count": 1
  182.  
    },
  183.  
    {
  184.  
    "key": ["系统用户", "Quber10"],
  185.  
    "key_as_string": "系统用户|Quber10",
  186.  
    "doc_count": 2
  187.  
    },
  188.  
    {
  189.  
    "key": ["系统用户", "Quber2"],
  190.  
    "key_as_string": "系统用户|Quber2",
  191.  
    "doc_count": 3
  192.  
    },
  193.  
    {
  194.  
    "key": ["系统用户", "Quber3"],
  195.  
    "key_as_string": "系统用户|Quber3",
  196.  
    "doc_count": 1
  197.  
    },
  198.  
    {
  199.  
    "key": ["系统用户", "Quber4"],
  200.  
    "key_as_string": "系统用户|Quber4",
  201.  
    "doc_count": 2
  202.  
    },
  203.  
    {
  204.  
    "key": ["系统用户", "Quber5"],
  205.  
    "key_as_string": "系统用户|Quber5",
  206.  
    "doc_count": 3
  207.  
    },
  208.  
    {
  209.  
    "key": ["系统用户", "Quber6"],
  210.  
    "key_as_string": "系统用户|Quber6",
  211.  
    "doc_count": 3
  212.  
    },
  213.  
    {
  214.  
    "key": ["系统用户", "Quber7"],
  215.  
    "key_as_string": "系统用户|Quber7",
  216.  
    "doc_count": 1
  217.  
    },
  218.  
    {
  219.  
    "key": ["系统用户", "Quber9"],
  220.  
    "key_as_string": "系统用户|Quber9",
  221.  
    "doc_count": 1
  222.  
    },
  223.  
    {
  224.  
    "key": ["高级用户", "Jack4"],
  225.  
    "key_as_string": "高级用户|Jack4",
  226.  
    "doc_count": 1
  227.  
    },
  228.  
    {
  229.  
    "key": ["高级用户", "Jack5"],
  230.  
    "key_as_string": "高级用户|Jack5",
  231.  
    "doc_count": 1
  232.  
    },
  233.  
    {
  234.  
    "key": ["高级用户", "Quber1"],
  235.  
    "key_as_string": "高级用户|Quber1",
  236.  
    "doc_count": 2
  237.  
    },
  238.  
    {
  239.  
    "key": ["高级用户", "Quber2"],
  240.  
    "key_as_string": "高级用户|Quber2",
  241.  
    "doc_count": 2
  242.  
    },
  243.  
    {
  244.  
    "key": ["高级用户", "Quber3"],
  245.  
    "key_as_string": "高级用户|Quber3",
  246.  
    "doc_count": 3
  247.  
    },
  248.  
    {
  249.  
    "key": ["高级用户", "Quber4"],
  250.  
    "key_as_string": "高级用户|Quber4",
  251.  
    "doc_count": 2
  252.  
    },
  253.  
    {
  254.  
    "key": ["高级用户", "Quber5"],
  255.  
    "key_as_string": "高级用户|Quber5",
  256.  
    "doc_count": 1
  257.  
    },
  258.  
    {
  259.  
    "key": ["高级用户", "Quber7"],
  260.  
    "key_as_string": "高级用户|Quber7",
  261.  
    "doc_count": 1
  262.  
    },
  263.  
    {
  264.  
    "key": ["高级用户", "Quber8"],
  265.  
    "key_as_string": "高级用户|Quber8",
  266.  
    "doc_count": 2
  267.  
    },
  268.  
    {
  269.  
    "key": ["高级用户", "Quber9"],
  270.  
    "key_as_string": "高级用户|Quber9",
  271.  
    "doc_count": 1
  272.  
    }
  273.  
    ]
  274.  
    }
  275.  
    }
  276.  
    }
学新通

使用示例(日期字段分组,按月统计):

  1.  
    //定义查询条件:(Id >= 1)
  2.  
    var queryCon = QuickElasticSearchExtension
  3.  
    //创建条件(默认创建了一个组合条件)
  4.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  5.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  6.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  7.  
    (queryCon) =>
  8.  
    {
  9.  
    //查询条件:(Id >= 1)
  10.  
    queryCon.AddGte(m => m.Id, 1);
  11.  
    });
  12.  
     
  13.  
    //同步
  14.  
    var retGetGroupsDateMonth = _quickElasticSearch.GetGroupsDateMonth<TestElasticSearchModel>(m => m.CreateTime, queryCon);
  15.  
     
  16.  
    //异步
  17.  
    var retGetGroupsDateMonthAsync = await _quickElasticSearch.GetGroupsDateMonthAsync<TestElasticSearchModel>(m => m.CreateTime, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-08",
  7.  
    "Count": 110
  8.  
    },
  9.  
    {
  10.  
    "Name": "2022-09",
  11.  
    "Count": 132
  12.  
    },
  13.  
    {
  14.  
    "Name": "2022-10",
  15.  
    "Count": 166
  16.  
    }
  17.  
    ]
  18.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "date_histogram":{
  7.  
    "field":"CreateTime",
  8.  
    "format":"yyyy-MM",
  9.  
    "calendar_interval":"1M",
  10.  
    "min_doc_count":0,
  11.  
    "order":{
  12.  
    "_key":"asc"
  13.  
    },
  14.  
    "time_zone":" 08:00"
  15.  
    }
  16.  
    }
  17.  
    },
  18.  
    "query":{
  19.  
    "bool":{
  20.  
    "must":[
  21.  
    {
  22.  
    "range":{
  23.  
    "Id":{
  24.  
    "gte":1
  25.  
    }
  26.  
    }
  27.  
    }
  28.  
    ]
  29.  
    }
  30.  
    },
  31.  
    "size":0
  32.  
    }
学新通
  1.  
    {
  2.  
    "took": 2,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10",
  23.  
    "key": 1664553600000,
  24.  
    "doc_count": 75
  25.  
    }
  26.  
    ]
  27.  
    }
  28.  
    }
  29.  
    }
学新通

使用示例(日期字段分组,支持按年、季度、月份、星期、天、小时、分、秒等维度进行统计):

  1.  
    //统计的时间间隔维度支持的表达式有(1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupsDate = _quickElasticSearch.GetGroupsDate<TestElasticSearchModel>(m => m.CreateTime, "1m", "yyyy-MM-dd HH:mm", queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupsDateAsync = await _quickElasticSearch.GetGroupsDateAsync<TestElasticSearchModel>(m => m.CreateTime, "1m", "yyyy-MM-dd HH:mm", queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-10-12 09:24",
  7.  
    "Count": 10
  8.  
    },
  9.  
    {
  10.  
    "Name": "2022-10-12 09:25",
  11.  
    "Count": 50
  12.  
    },
  13.  
    {
  14.  
    "Name": "2022-10-12 09:26",
  15.  
    "Count": 10
  16.  
    },
  17.  
    {
  18.  
    "Name": "2022-10-12 09:27",
  19.  
    "Count": 10
  20.  
    },
  21.  
    {
  22.  
    "Name": "2022-10-12 09:28",
  23.  
    "Count": 0
  24.  
    },
  25.  
    {
  26.  
    "Name": "2022-10-12 09:29",
  27.  
    "Count": 0
  28.  
    },
  29.  
    {
  30.  
    "Name": "2022-10-12 09:30",
  31.  
    "Count": 0
  32.  
    },
  33.  
    {
  34.  
    "Name": "2022-10-12 09:31",
  35.  
    "Count": 0
  36.  
    },
  37.  
    {
  38.  
    "Name": "2022-10-12 09:32",
  39.  
    "Count": 0
  40.  
    },
  41.  
    {
  42.  
    "Name": "2022-10-12 09:33",
  43.  
    "Count": 0
  44.  
    },
  45.  
    {
  46.  
    "Name": "2022-10-12 09:34",
  47.  
    "Count": 0
  48.  
    },
  49.  
    {
  50.  
    "Name": "2022-10-12 09:35",
  51.  
    "Count": 0
  52.  
    },
  53.  
    {
  54.  
    "Name": "2022-10-12 09:36",
  55.  
    "Count": 11
  56.  
    },
  57.  
    {
  58.  
    "Name": "2022-10-12 09:37",
  59.  
    "Count": 41
  60.  
    }
  61.  
    ]
  62.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "date_histogram":{
  7.  
    "field":"CreateTime",
  8.  
    "format":"yyyy-MM-dd HH:mm",
  9.  
    "calendar_interval":"1m",
  10.  
    "min_doc_count":0,
  11.  
    "order":{
  12.  
    "_key":"asc"
  13.  
    },
  14.  
    "time_zone":" 08:00"
  15.  
    }
  16.  
    }
  17.  
    },
  18.  
    "query":{
  19.  
    "bool":{
  20.  
    "must":[
  21.  
    {
  22.  
    "range":{
  23.  
    "Id":{
  24.  
    "gte":1
  25.  
    }
  26.  
    }
  27.  
    }
  28.  
    ]
  29.  
    }
  30.  
    },
  31.  
    "size":0
  32.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10-17 16:05",
  23.  
    "key": 1665993900000,
  24.  
    "doc_count": 15
  25.  
    },
  26.  
    {
  27.  
    "key_as_string": "2022-10-17 16:06",
  28.  
    "key": 1665993960000,
  29.  
    "doc_count": 50
  30.  
    },
  31.  
    {
  32.  
    "key_as_string": "2022-10-17 16:07",
  33.  
    "key": 1665994020000,
  34.  
    "doc_count": 10
  35.  
    }
  36.  
    ]
  37.  
    }
  38.  
    }
  39.  
    }
学新通

使用示例(日期字段分组,按月统计,并返回另一个字段的总和、最大值、最小值和平均值):

  1.  
    //定义查询条件:(Id >= 1)
  2.  
    var queryCon = QuickElasticSearchExtension
  3.  
    //创建条件(默认创建了一个组合条件)
  4.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  5.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  6.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  7.  
    (queryCon) =>
  8.  
    {
  9.  
    //查询条件:(Id >= 1)
  10.  
    queryCon.AddGte(m => m.Id, 1);
  11.  
    });
  12.  
     
  13.  
    //同步
  14.  
    var retGetGroupsDateMonthSmma = _quickElasticSearch.GetGroupsDateMonthSmma<TestElasticSearchModel>(m => m.CreateTime, m => m.UserAge, queryCon);
  15.  
     
  16.  
    //异步
  17.  
    var retGetGroupsDateMonthSmmaAsync = await _quickElasticSearch.GetGroupsDateMonthSmmaAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserAge, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-10",
  7.  
    "Count": 132,
  8.  
    "Sum": 6842,
  9.  
    "Max": 79,
  10.  
    "Min": 21,
  11.  
    "Avg": 51.83
  12.  
    }
  13.  
    ]
  14.  
    }
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiSum":{
  8.  
    "sum":{
  9.  
    "field":"UserAge"
  10.  
    }
  11.  
    },
  12.  
    "StatiMax":{
  13.  
    "max":{
  14.  
    "field":"UserAge"
  15.  
    }
  16.  
    },
  17.  
    "StatiMin":{
  18.  
    "min":{
  19.  
    "field":"UserAge"
  20.  
    }
  21.  
    },
  22.  
    "StatiAvg":{
  23.  
    "avg":{
  24.  
    "field":"UserAge"
  25.  
    }
  26.  
    }
  27.  
    },
  28.  
    "date_histogram":{
  29.  
    "field":"CreateTime",
  30.  
    "format":"yyyy-MM",
  31.  
    "calendar_interval":"1M",
  32.  
    "min_doc_count":0,
  33.  
    "order":{
  34.  
    "_key":"asc"
  35.  
    },
  36.  
    "time_zone":" 08:00"
  37.  
    }
  38.  
    }
  39.  
    },
  40.  
    "query":{
  41.  
    "bool":{
  42.  
    "must":[
  43.  
    {
  44.  
    "range":{
  45.  
    "Id":{
  46.  
    "gte":1
  47.  
    }
  48.  
    }
  49.  
    }
  50.  
    ]
  51.  
    }
  52.  
    },
  53.  
    "size":0
  54.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10",
  23.  
    "key": 1664553600000,
  24.  
    "doc_count": 75,
  25.  
    "avg#StatiAvg": {
  26.  
    "value": 46.92
  27.  
    },
  28.  
    "max#StatiMax": {
  29.  
    "value": 79.0
  30.  
    },
  31.  
    "min#StatiMin": {
  32.  
    "value": 20.0
  33.  
    },
  34.  
    "sum#StatiSum": {
  35.  
    "value": 3519.0
  36.  
    }
  37.  
    }
  38.  
    ]
  39.  
    }
  40.  
    }
  41.  
    }
学新通

使用示例(日期字段分组,并返回另一个字段的总和、最大值、最小值和平均值):

  1.  
    //统计的时间间隔维度支持的表达式有(1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupsDateSmma = _quickElasticSearch.GetGroupsDateSmma<TestElasticSearchModel>(m => m.CreateTime, m => m.UserAge, "1m", "yyyy-MM-dd HH:mm", queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupsDateSmmaAsync = await _quickElasticSearch.GetGroupsDateSmmaAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserAge, "1m", "yyyy-MM-dd HH:mm", queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-10-12 09:24",
  7.  
    "Count": 10,
  8.  
    "Sum": 588,
  9.  
    "Max": 76,
  10.  
    "Min": 31,
  11.  
    "Avg": 58.8
  12.  
    },
  13.  
    {
  14.  
    "Name": "2022-10-12 09:25",
  15.  
    "Count": 50,
  16.  
    "Sum": 2432,
  17.  
    "Max": 79,
  18.  
    "Min": 21,
  19.  
    "Avg": 48.64
  20.  
    },
  21.  
    {
  22.  
    "Name": "2022-10-12 09:26",
  23.  
    "Count": 10,
  24.  
    "Sum": 512,
  25.  
    "Max": 79,
  26.  
    "Min": 27,
  27.  
    "Avg": 51.2
  28.  
    },
  29.  
    {
  30.  
    "Name": "2022-10-12 09:27",
  31.  
    "Count": 10,
  32.  
    "Sum": 616,
  33.  
    "Max": 76,
  34.  
    "Min": 34,
  35.  
    "Avg": 61.6
  36.  
    },
  37.  
    {
  38.  
    "Name": "2022-10-12 09:28",
  39.  
    "Count": 0,
  40.  
    "Sum": 0,
  41.  
    "Max": 0,
  42.  
    "Min": 0,
  43.  
    "Avg": 0
  44.  
    },
  45.  
    {
  46.  
    "Name": "2022-10-12 09:29",
  47.  
    "Count": 0,
  48.  
    "Sum": 0,
  49.  
    "Max": 0,
  50.  
    "Min": 0,
  51.  
    "Avg": 0
  52.  
    },
  53.  
    {
  54.  
    "Name": "2022-10-12 09:30",
  55.  
    "Count": 0,
  56.  
    "Sum": 0,
  57.  
    "Max": 0,
  58.  
    "Min": 0,
  59.  
    "Avg": 0
  60.  
    },
  61.  
    {
  62.  
    "Name": "2022-10-12 09:31",
  63.  
    "Count": 0,
  64.  
    "Sum": 0,
  65.  
    "Max": 0,
  66.  
    "Min": 0,
  67.  
    "Avg": 0
  68.  
    },
  69.  
    {
  70.  
    "Name": "2022-10-12 09:32",
  71.  
    "Count": 0,
  72.  
    "Sum": 0,
  73.  
    "Max": 0,
  74.  
    "Min": 0,
  75.  
    "Avg": 0
  76.  
    },
  77.  
    {
  78.  
    "Name": "2022-10-12 09:33",
  79.  
    "Count": 0,
  80.  
    "Sum": 0,
  81.  
    "Max": 0,
  82.  
    "Min": 0,
  83.  
    "Avg": 0
  84.  
    },
  85.  
    {
  86.  
    "Name": "2022-10-12 09:34",
  87.  
    "Count": 0,
  88.  
    "Sum": 0,
  89.  
    "Max": 0,
  90.  
    "Min": 0,
  91.  
    "Avg": 0
  92.  
    },
  93.  
    {
  94.  
    "Name": "2022-10-12 09:35",
  95.  
    "Count": 0,
  96.  
    "Sum": 0,
  97.  
    "Max": 0,
  98.  
    "Min": 0,
  99.  
    "Avg": 0
  100.  
    },
  101.  
    {
  102.  
    "Name": "2022-10-12 09:36",
  103.  
    "Count": 11,
  104.  
    "Sum": 527,
  105.  
    "Max": 74,
  106.  
    "Min": 21,
  107.  
    "Avg": 47.91
  108.  
    },
  109.  
    {
  110.  
    "Name": "2022-10-12 09:37",
  111.  
    "Count": 41,
  112.  
    "Sum": 2167,
  113.  
    "Max": 78,
  114.  
    "Min": 25,
  115.  
    "Avg": 52.85
  116.  
    }
  117.  
    ]
  118.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiSum":{
  8.  
    "sum":{
  9.  
    "field":"UserAge"
  10.  
    }
  11.  
    },
  12.  
    "StatiMax":{
  13.  
    "max":{
  14.  
    "field":"UserAge"
  15.  
    }
  16.  
    },
  17.  
    "StatiMin":{
  18.  
    "min":{
  19.  
    "field":"UserAge"
  20.  
    }
  21.  
    },
  22.  
    "StatiAvg":{
  23.  
    "avg":{
  24.  
    "field":"UserAge"
  25.  
    }
  26.  
    }
  27.  
    },
  28.  
    "date_histogram":{
  29.  
    "field":"CreateTime",
  30.  
    "format":"yyyy-MM-dd HH:mm",
  31.  
    "calendar_interval":"1m",
  32.  
    "min_doc_count":0,
  33.  
    "order":{
  34.  
    "_key":"asc"
  35.  
    },
  36.  
    "time_zone":" 08:00"
  37.  
    }
  38.  
    }
  39.  
    },
  40.  
    "query":{
  41.  
    "bool":{
  42.  
    "must":[
  43.  
    {
  44.  
    "range":{
  45.  
    "Id":{
  46.  
    "gte":1
  47.  
    }
  48.  
    }
  49.  
    }
  50.  
    ]
  51.  
    }
  52.  
    },
  53.  
    "size":0
  54.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10-17 16:05",
  23.  
    "key": 1665993900000,
  24.  
    "doc_count": 15,
  25.  
    "avg#StatiAvg": {
  26.  
    "value": 44.06666666666667
  27.  
    },
  28.  
    "max#StatiMax": {
  29.  
    "value": 76.0
  30.  
    },
  31.  
    "min#StatiMin": {
  32.  
    "value": 21.0
  33.  
    },
  34.  
    "sum#StatiSum": {
  35.  
    "value": 661.0
  36.  
    }
  37.  
    },
  38.  
    {
  39.  
    "key_as_string": "2022-10-17 16:06",
  40.  
    "key": 1665993960000,
  41.  
    "doc_count": 50,
  42.  
    "avg#StatiAvg": {
  43.  
    "value": 46.2
  44.  
    },
  45.  
    "max#StatiMax": {
  46.  
    "value": 79.0
  47.  
    },
  48.  
    "min#StatiMin": {
  49.  
    "value": 20.0
  50.  
    },
  51.  
    "sum#StatiSum": {
  52.  
    "value": 2310.0
  53.  
    }
  54.  
    },
  55.  
    {
  56.  
    "key_as_string": "2022-10-17 16:07",
  57.  
    "key": 1665994020000,
  58.  
    "doc_count": 10,
  59.  
    "avg#StatiAvg": {
  60.  
    "value": 54.8
  61.  
    },
  62.  
    "max#StatiMax": {
  63.  
    "value": 78.0
  64.  
    },
  65.  
    "min#StatiMin": {
  66.  
    "value": 30.0
  67.  
    },
  68.  
    "sum#StatiSum": {
  69.  
    "value": 548.0
  70.  
    }
  71.  
    }
  72.  
    ]
  73.  
    }
  74.  
    }
  75.  
    }
学新通

使用示例(日期字段分组,按某年 1~12 月统计每个月的某个字段每个月的总和以及这一年的总和):

  1.  
    //定义查询条件:(Id >= 1)
  2.  
    var queryCon = QuickElasticSearchExtension
  3.  
    //创建条件(默认创建了一个组合条件)
  4.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  5.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  6.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  7.  
    (queryCon) =>
  8.  
    {
  9.  
    //查询条件:(Id >= 1)
  10.  
    queryCon.AddGte(m => m.Id, 1);
  11.  
    });
  12.  
     
  13.  
    //同步
  14.  
    var retGetGroupsDateMonthOneYear = _quickElasticSearch.GetGroupsDateMonthOneYear<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, 2022, queryCon);
  15.  
     
  16.  
    //异步
  17.  
    var retGetGroupsDateMonthOneYearAsync = await _quickElasticSearch.GetGroupsDateMonthOneYearAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, 2022, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    ["Jack1", 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 54],
  6.  
    ["Jack2", 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 98],
  7.  
    ["Jack3", 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 126]
  8.  
    ]
  9.  
    }
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiGroup-1":{
  8.  
    "aggs":{
  9.  
    "StatiSum":{
  10.  
    "sum":{
  11.  
    "field":"UserAge"
  12.  
    }
  13.  
    },
  14.  
    "StatiMax":{
  15.  
    "max":{
  16.  
    "field":"UserAge"
  17.  
    }
  18.  
    },
  19.  
    "StatiMin":{
  20.  
    "min":{
  21.  
    "field":"UserAge"
  22.  
    }
  23.  
    },
  24.  
    "StatiAvg":{
  25.  
    "avg":{
  26.  
    "field":"UserAge"
  27.  
    }
  28.  
    }
  29.  
    },
  30.  
    "terms":{
  31.  
    "field":"UserName",
  32.  
    "order":[
  33.  
    {
  34.  
    "_key":"asc"
  35.  
    },
  36.  
    {
  37.  
    "_count":"asc"
  38.  
    }
  39.  
    ],
  40.  
    "size":2000000000
  41.  
    }
  42.  
    }
  43.  
    },
  44.  
    "date_histogram":{
  45.  
    "field":"CreateTime",
  46.  
    "format":"yyyy-MM",
  47.  
    "calendar_interval":"1M",
  48.  
    "min_doc_count":0,
  49.  
    "order":{
  50.  
    "_key":"asc"
  51.  
    },
  52.  
    "time_zone":" 08:00"
  53.  
    }
  54.  
    }
  55.  
    },
  56.  
    "query":{
  57.  
    "bool":{
  58.  
    "must":[
  59.  
    {
  60.  
    "range":{
  61.  
    "Id":{
  62.  
    "gte":1
  63.  
    }
  64.  
    }
  65.  
    }
  66.  
    ]
  67.  
    }
  68.  
    },
  69.  
    "size":0
  70.  
    }
学新通
  1.  
    {
  2.  
    "took": 1,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10",
  23.  
    "key": 1664553600000,
  24.  
    "doc_count": 75,
  25.  
    "sterms#StatiGroup-1": {
  26.  
    "doc_count_error_upper_bound": 0,
  27.  
    "sum_other_doc_count": 0,
  28.  
    "buckets": [
  29.  
    {
  30.  
    "key": "Jack1",
  31.  
    "doc_count": 2,
  32.  
    "avg#StatiAvg": {
  33.  
    "value": 34.0
  34.  
    },
  35.  
    "max#StatiMax": {
  36.  
    "value": 39.0
  37.  
    },
  38.  
    "min#StatiMin": {
  39.  
    "value": 29.0
  40.  
    },
  41.  
    "sum#StatiSum": {
  42.  
    "value": 68.0
  43.  
    }
  44.  
    },
  45.  
    {
  46.  
    "key": "Jack10",
  47.  
    "doc_count": 1,
  48.  
    "avg#StatiAvg": {
  49.  
    "value": 60.0
  50.  
    },
  51.  
    "max#StatiMax": {
  52.  
    "value": 60.0
  53.  
    },
  54.  
    "min#StatiMin": {
  55.  
    "value": 60.0
  56.  
    },
  57.  
    "sum#StatiSum": {
  58.  
    "value": 60.0
  59.  
    }
  60.  
    },
  61.  
    {
  62.  
    "key": "Jack2",
  63.  
    "doc_count": 2,
  64.  
    "avg#StatiAvg": {
  65.  
    "value": 40.0
  66.  
    },
  67.  
    "max#StatiMax": {
  68.  
    "value": 48.0
  69.  
    },
  70.  
    "min#StatiMin": {
  71.  
    "value": 32.0
  72.  
    },
  73.  
    "sum#StatiSum": {
  74.  
    "value": 80.0
  75.  
    }
  76.  
    },
  77.  
    {
  78.  
    "key": "Jack3",
  79.  
    "doc_count": 2,
  80.  
    "avg#StatiAvg": {
  81.  
    "value": 39.5
  82.  
    },
  83.  
    "max#StatiMax": {
  84.  
    "value": 53.0
  85.  
    },
  86.  
    "min#StatiMin": {
  87.  
    "value": 26.0
  88.  
    },
  89.  
    "sum#StatiSum": {
  90.  
    "value": 79.0
  91.  
    }
  92.  
    },
  93.  
    {
  94.  
    "key": "Jack4",
  95.  
    "doc_count": 2,
  96.  
    "avg#StatiAvg": {
  97.  
    "value": 48.0
  98.  
    },
  99.  
    "max#StatiMax": {
  100.  
    "value": 65.0
  101.  
    },
  102.  
    "min#StatiMin": {
  103.  
    "value": 31.0
  104.  
    },
  105.  
    "sum#StatiSum": {
  106.  
    "value": 96.0
  107.  
    }
  108.  
    },
  109.  
    {
  110.  
    "key": "Jack5",
  111.  
    "doc_count": 2,
  112.  
    "avg#StatiAvg": {
  113.  
    "value": 54.0
  114.  
    },
  115.  
    "max#StatiMax": {
  116.  
    "value": 78.0
  117.  
    },
  118.  
    "min#StatiMin": {
  119.  
    "value": 30.0
  120.  
    },
  121.  
    "sum#StatiSum": {
  122.  
    "value": 108.0
  123.  
    }
  124.  
    },
  125.  
    {
  126.  
    "key": "Jack6",
  127.  
    "doc_count": 1,
  128.  
    "avg#StatiAvg": {
  129.  
    "value": 57.0
  130.  
    },
  131.  
    "max#StatiMax": {
  132.  
    "value": 57.0
  133.  
    },
  134.  
    "min#StatiMin": {
  135.  
    "value": 57.0
  136.  
    },
  137.  
    "sum#StatiSum": {
  138.  
    "value": 57.0
  139.  
    }
  140.  
    },
  141.  
    {
  142.  
    "key": "Jack7",
  143.  
    "doc_count": 1,
  144.  
    "avg#StatiAvg": {
  145.  
    "value": 40.0
  146.  
    },
  147.  
    "max#StatiMax": {
  148.  
    "value": 40.0
  149.  
    },
  150.  
    "min#StatiMin": {
  151.  
    "value": 40.0
  152.  
    },
  153.  
    "sum#StatiSum": {
  154.  
    "value": 40.0
  155.  
    }
  156.  
    },
  157.  
    {
  158.  
    "key": "Jack8",
  159.  
    "doc_count": 1,
  160.  
    "avg#StatiAvg": {
  161.  
    "value": 29.0
  162.  
    },
  163.  
    "max#StatiMax": {
  164.  
    "value": 29.0
  165.  
    },
  166.  
    "min#StatiMin": {
  167.  
    "value": 29.0
  168.  
    },
  169.  
    "sum#StatiSum": {
  170.  
    "value": 29.0
  171.  
    }
  172.  
    },
  173.  
    {
  174.  
    "key": "Jack9",
  175.  
    "doc_count": 1,
  176.  
    "avg#StatiAvg": {
  177.  
    "value": 72.0
  178.  
    },
  179.  
    "max#StatiMax": {
  180.  
    "value": 72.0
  181.  
    },
  182.  
    "min#StatiMin": {
  183.  
    "value": 72.0
  184.  
    },
  185.  
    "sum#StatiSum": {
  186.  
    "value": 72.0
  187.  
    }
  188.  
    },
  189.  
    {
  190.  
    "key": "Quber1",
  191.  
    "doc_count": 7,
  192.  
    "avg#StatiAvg": {
  193.  
    "value": 48.857142857142854
  194.  
    },
  195.  
    "max#StatiMax": {
  196.  
    "value": 79.0
  197.  
    },
  198.  
    "min#StatiMin": {
  199.  
    "value": 21.0
  200.  
    },
  201.  
    "sum#StatiSum": {
  202.  
    "value": 342.0
  203.  
    }
  204.  
    },
  205.  
    {
  206.  
    "key": "Quber10",
  207.  
    "doc_count": 3,
  208.  
    "avg#StatiAvg": {
  209.  
    "value": 31.0
  210.  
    },
  211.  
    "max#StatiMax": {
  212.  
    "value": 43.0
  213.  
    },
  214.  
    "min#StatiMin": {
  215.  
    "value": 20.0
  216.  
    },
  217.  
    "sum#StatiSum": {
  218.  
    "value": 93.0
  219.  
    }
  220.  
    },
  221.  
    {
  222.  
    "key": "Quber11",
  223.  
    "doc_count": 1,
  224.  
    "avg#StatiAvg": {
  225.  
    "value": 29.0
  226.  
    },
  227.  
    "max#StatiMax": {
  228.  
    "value": 29.0
  229.  
    },
  230.  
    "min#StatiMin": {
  231.  
    "value": 29.0
  232.  
    },
  233.  
    "sum#StatiSum": {
  234.  
    "value": 29.0
  235.  
    }
  236.  
    },
  237.  
    {
  238.  
    "key": "Quber12",
  239.  
    "doc_count": 1,
  240.  
    "avg#StatiAvg": {
  241.  
    "value": 74.0
  242.  
    },
  243.  
    "max#StatiMax": {
  244.  
    "value": 74.0
  245.  
    },
  246.  
    "min#StatiMin": {
  247.  
    "value": 74.0
  248.  
    },
  249.  
    "sum#StatiSum": {
  250.  
    "value": 74.0
  251.  
    }
  252.  
    },
  253.  
    {
  254.  
    "key": "Quber2",
  255.  
    "doc_count": 7,
  256.  
    "avg#StatiAvg": {
  257.  
    "value": 51.0
  258.  
    },
  259.  
    "max#StatiMax": {
  260.  
    "value": 78.0
  261.  
    },
  262.  
    "min#StatiMin": {
  263.  
    "value": 25.0
  264.  
    },
  265.  
    "sum#StatiSum": {
  266.  
    "value": 357.0
  267.  
    }
  268.  
    },
  269.  
    {
  270.  
    "key": "Quber3",
  271.  
    "doc_count": 7,
  272.  
    "avg#StatiAvg": {
  273.  
    "value": 48.142857142857146
  274.  
    },
  275.  
    "max#StatiMax": {
  276.  
    "value": 74.0
  277.  
    },
  278.  
    "min#StatiMin": {
  279.  
    "value": 28.0
  280.  
    },
  281.  
    "sum#StatiSum": {
  282.  
    "value": 337.0
  283.  
    }
  284.  
    },
  285.  
    {
  286.  
    "key": "Quber4",
  287.  
    "doc_count": 7,
  288.  
    "avg#StatiAvg": {
  289.  
    "value": 53.285714285714285
  290.  
    },
  291.  
    "max#StatiMax": {
  292.  
    "value": 76.0
  293.  
    },
  294.  
    "min#StatiMin": {
  295.  
    "value": 25.0
  296.  
    },
  297.  
    "sum#StatiSum": {
  298.  
    "value": 373.0
  299.  
    }
  300.  
    },
  301.  
    {
  302.  
    "key": "Quber5",
  303.  
    "doc_count": 7,
  304.  
    "avg#StatiAvg": {
  305.  
    "value": 47.285714285714285
  306.  
    },
  307.  
    "max#StatiMax": {
  308.  
    "value": 70.0
  309.  
    },
  310.  
    "min#StatiMin": {
  311.  
    "value": 25.0
  312.  
    },
  313.  
    "sum#StatiSum": {
  314.  
    "value": 331.0
  315.  
    }
  316.  
    },
  317.  
    {
  318.  
    "key": "Quber6",
  319.  
    "doc_count": 6,
  320.  
    "avg#StatiAvg": {
  321.  
    "value": 41.5
  322.  
    },
  323.  
    "max#StatiMax": {
  324.  
    "value": 78.0
  325.  
    },
  326.  
    "min#StatiMin": {
  327.  
    "value": 20.0
  328.  
    },
  329.  
    "sum#StatiSum": {
  330.  
    "value": 249.0
  331.  
    }
  332.  
    },
  333.  
    {
  334.  
    "key": "Quber7",
  335.  
    "doc_count": 5,
  336.  
    "avg#StatiAvg": {
  337.  
    "value": 43.0
  338.  
    },
  339.  
    "max#StatiMax": {
  340.  
    "value": 61.0
  341.  
    },
  342.  
    "min#StatiMin": {
  343.  
    "value": 21.0
  344.  
    },
  345.  
    "sum#StatiSum": {
  346.  
    "value": 215.0
  347.  
    }
  348.  
    },
  349.  
    {
  350.  
    "key": "Quber8",
  351.  
    "doc_count": 5,
  352.  
    "avg#StatiAvg": {
  353.  
    "value": 42.2
  354.  
    },
  355.  
    "max#StatiMax": {
  356.  
    "value": 61.0
  357.  
    },
  358.  
    "min#StatiMin": {
  359.  
    "value": 22.0
  360.  
    },
  361.  
    "sum#StatiSum": {
  362.  
    "value": 211.0
  363.  
    }
  364.  
    },
  365.  
    {
  366.  
    "key": "Quber9",
  367.  
    "doc_count": 4,
  368.  
    "avg#StatiAvg": {
  369.  
    "value": 54.75
  370.  
    },
  371.  
    "max#StatiMax": {
  372.  
    "value": 65.0
  373.  
    },
  374.  
    "min#StatiMin": {
  375.  
    "value": 39.0
  376.  
    },
  377.  
    "sum#StatiSum": {
  378.  
    "value": 219.0
  379.  
    }
  380.  
    }
  381.  
    ]
  382.  
    }
  383.  
    }
  384.  
    ]
  385.  
    }
  386.  
    }
  387.  
    }
学新通

使用示例(日期字段分组,按月统计,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值):

  1.  
    //定义查询条件:(Id >= 1)
  2.  
    var queryCon = QuickElasticSearchExtension
  3.  
    //创建条件(默认创建了一个组合条件)
  4.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  5.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  6.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  7.  
    (queryCon) =>
  8.  
    {
  9.  
    //查询条件:(Id >= 1)
  10.  
    queryCon.AddGte(m => m.Id, 1);
  11.  
    });
  12.  
     
  13.  
    //同步
  14.  
    var retGetGroupsDateMonth = _quickElasticSearch.GetGroupsDateMonth<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, queryCon);
  15.  
     
  16.  
    //异步
  17.  
    var retGetGroupsDateMonthAsync = await _quickElasticSearch.GetGroupsDateMonthAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-10",
  7.  
    "Count": 132,
  8.  
    "Group": [
  9.  
    {
  10.  
    "Name": "Jack1",
  11.  
    "Count": 2,
  12.  
    "Sum": 54,
  13.  
    "Max": 31,
  14.  
    "Min": 23,
  15.  
    "Avg": 27
  16.  
    },
  17.  
    {
  18.  
    "Name": "Jack2",
  19.  
    "Count": 2,
  20.  
    "Sum": 98,
  21.  
    "Max": 77,
  22.  
    "Min": 21,
  23.  
    "Avg": 49
  24.  
    },
  25.  
    {
  26.  
    "Name": "Jack3",
  27.  
    "Count": 2,
  28.  
    "Sum": 126,
  29.  
    "Max": 67,
  30.  
    "Min": 59,
  31.  
    "Avg": 63
  32.  
    }
  33.  
    ]
  34.  
    }
  35.  
    ]
  36.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiGroup-1":{
  8.  
    "aggs":{
  9.  
    "StatiSum":{
  10.  
    "sum":{
  11.  
    "field":"UserAge"
  12.  
    }
  13.  
    },
  14.  
    "StatiMax":{
  15.  
    "max":{
  16.  
    "field":"UserAge"
  17.  
    }
  18.  
    },
  19.  
    "StatiMin":{
  20.  
    "min":{
  21.  
    "field":"UserAge"
  22.  
    }
  23.  
    },
  24.  
    "StatiAvg":{
  25.  
    "avg":{
  26.  
    "field":"UserAge"
  27.  
    }
  28.  
    }
  29.  
    },
  30.  
    "terms":{
  31.  
    "field":"UserName",
  32.  
    "order":[
  33.  
    {
  34.  
    "_key":"asc"
  35.  
    },
  36.  
    {
  37.  
    "_count":"asc"
  38.  
    }
  39.  
    ],
  40.  
    "size":2000000000
  41.  
    }
  42.  
    }
  43.  
    },
  44.  
    "date_histogram":{
  45.  
    "field":"CreateTime",
  46.  
    "format":"yyyy-MM",
  47.  
    "calendar_interval":"1M",
  48.  
    "min_doc_count":0,
  49.  
    "order":{
  50.  
    "_key":"asc"
  51.  
    },
  52.  
    "time_zone":" 08:00"
  53.  
    }
  54.  
    }
  55.  
    },
  56.  
    "query":{
  57.  
    "bool":{
  58.  
    "must":[
  59.  
    {
  60.  
    "range":{
  61.  
    "Id":{
  62.  
    "gte":1
  63.  
    }
  64.  
    }
  65.  
    }
  66.  
    ]
  67.  
    }
  68.  
    },
  69.  
    "size":0
  70.  
    }
学新通
  1.  
    {
  2.  
    "took": 2,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10",
  23.  
    "key": 1664553600000,
  24.  
    "doc_count": 75,
  25.  
    "sterms#StatiGroup-1": {
  26.  
    "doc_count_error_upper_bound": 0,
  27.  
    "sum_other_doc_count": 0,
  28.  
    "buckets": [
  29.  
    {
  30.  
    "key": "Jack1",
  31.  
    "doc_count": 2,
  32.  
    "avg#StatiAvg": {
  33.  
    "value": 34.0
  34.  
    },
  35.  
    "max#StatiMax": {
  36.  
    "value": 39.0
  37.  
    },
  38.  
    "min#StatiMin": {
  39.  
    "value": 29.0
  40.  
    },
  41.  
    "sum#StatiSum": {
  42.  
    "value": 68.0
  43.  
    }
  44.  
    },
  45.  
    {
  46.  
    "key": "Jack10",
  47.  
    "doc_count": 1,
  48.  
    "avg#StatiAvg": {
  49.  
    "value": 60.0
  50.  
    },
  51.  
    "max#StatiMax": {
  52.  
    "value": 60.0
  53.  
    },
  54.  
    "min#StatiMin": {
  55.  
    "value": 60.0
  56.  
    },
  57.  
    "sum#StatiSum": {
  58.  
    "value": 60.0
  59.  
    }
  60.  
    },
  61.  
    {
  62.  
    "key": "Jack2",
  63.  
    "doc_count": 2,
  64.  
    "avg#StatiAvg": {
  65.  
    "value": 40.0
  66.  
    },
  67.  
    "max#StatiMax": {
  68.  
    "value": 48.0
  69.  
    },
  70.  
    "min#StatiMin": {
  71.  
    "value": 32.0
  72.  
    },
  73.  
    "sum#StatiSum": {
  74.  
    "value": 80.0
  75.  
    }
  76.  
    },
  77.  
    {
  78.  
    "key": "Jack3",
  79.  
    "doc_count": 2,
  80.  
    "avg#StatiAvg": {
  81.  
    "value": 39.5
  82.  
    },
  83.  
    "max#StatiMax": {
  84.  
    "value": 53.0
  85.  
    },
  86.  
    "min#StatiMin": {
  87.  
    "value": 26.0
  88.  
    },
  89.  
    "sum#StatiSum": {
  90.  
    "value": 79.0
  91.  
    }
  92.  
    },
  93.  
    {
  94.  
    "key": "Jack4",
  95.  
    "doc_count": 2,
  96.  
    "avg#StatiAvg": {
  97.  
    "value": 48.0
  98.  
    },
  99.  
    "max#StatiMax": {
  100.  
    "value": 65.0
  101.  
    },
  102.  
    "min#StatiMin": {
  103.  
    "value": 31.0
  104.  
    },
  105.  
    "sum#StatiSum": {
  106.  
    "value": 96.0
  107.  
    }
  108.  
    },
  109.  
    {
  110.  
    "key": "Jack5",
  111.  
    "doc_count": 2,
  112.  
    "avg#StatiAvg": {
  113.  
    "value": 54.0
  114.  
    },
  115.  
    "max#StatiMax": {
  116.  
    "value": 78.0
  117.  
    },
  118.  
    "min#StatiMin": {
  119.  
    "value": 30.0
  120.  
    },
  121.  
    "sum#StatiSum": {
  122.  
    "value": 108.0
  123.  
    }
  124.  
    },
  125.  
    {
  126.  
    "key": "Jack6",
  127.  
    "doc_count": 1,
  128.  
    "avg#StatiAvg": {
  129.  
    "value": 57.0
  130.  
    },
  131.  
    "max#StatiMax": {
  132.  
    "value": 57.0
  133.  
    },
  134.  
    "min#StatiMin": {
  135.  
    "value": 57.0
  136.  
    },
  137.  
    "sum#StatiSum": {
  138.  
    "value": 57.0
  139.  
    }
  140.  
    },
  141.  
    {
  142.  
    "key": "Jack7",
  143.  
    "doc_count": 1,
  144.  
    "avg#StatiAvg": {
  145.  
    "value": 40.0
  146.  
    },
  147.  
    "max#StatiMax": {
  148.  
    "value": 40.0
  149.  
    },
  150.  
    "min#StatiMin": {
  151.  
    "value": 40.0
  152.  
    },
  153.  
    "sum#StatiSum": {
  154.  
    "value": 40.0
  155.  
    }
  156.  
    },
  157.  
    {
  158.  
    "key": "Jack8",
  159.  
    "doc_count": 1,
  160.  
    "avg#StatiAvg": {
  161.  
    "value": 29.0
  162.  
    },
  163.  
    "max#StatiMax": {
  164.  
    "value": 29.0
  165.  
    },
  166.  
    "min#StatiMin": {
  167.  
    "value": 29.0
  168.  
    },
  169.  
    "sum#StatiSum": {
  170.  
    "value": 29.0
  171.  
    }
  172.  
    },
  173.  
    {
  174.  
    "key": "Jack9",
  175.  
    "doc_count": 1,
  176.  
    "avg#StatiAvg": {
  177.  
    "value": 72.0
  178.  
    },
  179.  
    "max#StatiMax": {
  180.  
    "value": 72.0
  181.  
    },
  182.  
    "min#StatiMin": {
  183.  
    "value": 72.0
  184.  
    },
  185.  
    "sum#StatiSum": {
  186.  
    "value": 72.0
  187.  
    }
  188.  
    },
  189.  
    {
  190.  
    "key": "Quber1",
  191.  
    "doc_count": 7,
  192.  
    "avg#StatiAvg": {
  193.  
    "value": 48.857142857142854
  194.  
    },
  195.  
    "max#StatiMax": {
  196.  
    "value": 79.0
  197.  
    },
  198.  
    "min#StatiMin": {
  199.  
    "value": 21.0
  200.  
    },
  201.  
    "sum#StatiSum": {
  202.  
    "value": 342.0
  203.  
    }
  204.  
    },
  205.  
    {
  206.  
    "key": "Quber10",
  207.  
    "doc_count": 3,
  208.  
    "avg#StatiAvg": {
  209.  
    "value": 31.0
  210.  
    },
  211.  
    "max#StatiMax": {
  212.  
    "value": 43.0
  213.  
    },
  214.  
    "min#StatiMin": {
  215.  
    "value": 20.0
  216.  
    },
  217.  
    "sum#StatiSum": {
  218.  
    "value": 93.0
  219.  
    }
  220.  
    },
  221.  
    {
  222.  
    "key": "Quber11",
  223.  
    "doc_count": 1,
  224.  
    "avg#StatiAvg": {
  225.  
    "value": 29.0
  226.  
    },
  227.  
    "max#StatiMax": {
  228.  
    "value": 29.0
  229.  
    },
  230.  
    "min#StatiMin": {
  231.  
    "value": 29.0
  232.  
    },
  233.  
    "sum#StatiSum": {
  234.  
    "value": 29.0
  235.  
    }
  236.  
    },
  237.  
    {
  238.  
    "key": "Quber12",
  239.  
    "doc_count": 1,
  240.  
    "avg#StatiAvg": {
  241.  
    "value": 74.0
  242.  
    },
  243.  
    "max#StatiMax": {
  244.  
    "value": 74.0
  245.  
    },
  246.  
    "min#StatiMin": {
  247.  
    "value": 74.0
  248.  
    },
  249.  
    "sum#StatiSum": {
  250.  
    "value": 74.0
  251.  
    }
  252.  
    },
  253.  
    {
  254.  
    "key": "Quber2",
  255.  
    "doc_count": 7,
  256.  
    "avg#StatiAvg": {
  257.  
    "value": 51.0
  258.  
    },
  259.  
    "max#StatiMax": {
  260.  
    "value": 78.0
  261.  
    },
  262.  
    "min#StatiMin": {
  263.  
    "value": 25.0
  264.  
    },
  265.  
    "sum#StatiSum": {
  266.  
    "value": 357.0
  267.  
    }
  268.  
    },
  269.  
    {
  270.  
    "key": "Quber3",
  271.  
    "doc_count": 7,
  272.  
    "avg#StatiAvg": {
  273.  
    "value": 48.142857142857146
  274.  
    },
  275.  
    "max#StatiMax": {
  276.  
    "value": 74.0
  277.  
    },
  278.  
    "min#StatiMin": {
  279.  
    "value": 28.0
  280.  
    },
  281.  
    "sum#StatiSum": {
  282.  
    "value": 337.0
  283.  
    }
  284.  
    },
  285.  
    {
  286.  
    "key": "Quber4",
  287.  
    "doc_count": 7,
  288.  
    "avg#StatiAvg": {
  289.  
    "value": 53.285714285714285
  290.  
    },
  291.  
    "max#StatiMax": {
  292.  
    "value": 76.0
  293.  
    },
  294.  
    "min#StatiMin": {
  295.  
    "value": 25.0
  296.  
    },
  297.  
    "sum#StatiSum": {
  298.  
    "value": 373.0
  299.  
    }
  300.  
    },
  301.  
    {
  302.  
    "key": "Quber5",
  303.  
    "doc_count": 7,
  304.  
    "avg#StatiAvg": {
  305.  
    "value": 47.285714285714285
  306.  
    },
  307.  
    "max#StatiMax": {
  308.  
    "value": 70.0
  309.  
    },
  310.  
    "min#StatiMin": {
  311.  
    "value": 25.0
  312.  
    },
  313.  
    "sum#StatiSum": {
  314.  
    "value": 331.0
  315.  
    }
  316.  
    },
  317.  
    {
  318.  
    "key": "Quber6",
  319.  
    "doc_count": 6,
  320.  
    "avg#StatiAvg": {
  321.  
    "value": 41.5
  322.  
    },
  323.  
    "max#StatiMax": {
  324.  
    "value": 78.0
  325.  
    },
  326.  
    "min#StatiMin": {
  327.  
    "value": 20.0
  328.  
    },
  329.  
    "sum#StatiSum": {
  330.  
    "value": 249.0
  331.  
    }
  332.  
    },
  333.  
    {
  334.  
    "key": "Quber7",
  335.  
    "doc_count": 5,
  336.  
    "avg#StatiAvg": {
  337.  
    "value": 43.0
  338.  
    },
  339.  
    "max#StatiMax": {
  340.  
    "value": 61.0
  341.  
    },
  342.  
    "min#StatiMin": {
  343.  
    "value": 21.0
  344.  
    },
  345.  
    "sum#StatiSum": {
  346.  
    "value": 215.0
  347.  
    }
  348.  
    },
  349.  
    {
  350.  
    "key": "Quber8",
  351.  
    "doc_count": 5,
  352.  
    "avg#StatiAvg": {
  353.  
    "value": 42.2
  354.  
    },
  355.  
    "max#StatiMax": {
  356.  
    "value": 61.0
  357.  
    },
  358.  
    "min#StatiMin": {
  359.  
    "value": 22.0
  360.  
    },
  361.  
    "sum#StatiSum": {
  362.  
    "value": 211.0
  363.  
    }
  364.  
    },
  365.  
    {
  366.  
    "key": "Quber9",
  367.  
    "doc_count": 4,
  368.  
    "avg#StatiAvg": {
  369.  
    "value": 54.75
  370.  
    },
  371.  
    "max#StatiMax": {
  372.  
    "value": 65.0
  373.  
    },
  374.  
    "min#StatiMin": {
  375.  
    "value": 39.0
  376.  
    },
  377.  
    "sum#StatiSum": {
  378.  
    "value": 219.0
  379.  
    }
  380.  
    }
  381.  
    ]
  382.  
    }
  383.  
    }
  384.  
    ]
  385.  
    }
  386.  
    }
  387.  
    }
学新通

使用示例(日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值):

  1.  
    //统计的时间间隔维度支持的表达式有(1y:1年、1q:1季度、1M:1个月、1w:1星期、1d:1天、1h:1小时、1m:1分钟、1s:1秒钟)
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetGroupsDateSub = _quickElasticSearch.GetGroupsDateSub<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, "1h", "yyyy-MM-dd HH:mm", queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetGroupsDateSubAsync = await _quickElasticSearch.GetGroupsDateSubAsync<TestElasticSearchModel>(m => m.CreateTime, m => m.UserName, m => m.UserAge, "1h", "yyyy-MM-dd HH:mm", queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": [
  5.  
    {
  6.  
    "Name": "2022-10-12 09:00",
  7.  
    "Count": 132,
  8.  
    "Group": [
  9.  
    {
  10.  
    "Name": "Jack1",
  11.  
    "Count": 2,
  12.  
    "Sum": 54,
  13.  
    "Max": 31,
  14.  
    "Min": 23,
  15.  
    "Avg": 27
  16.  
    },
  17.  
    {
  18.  
    "Name": "Jack2",
  19.  
    "Count": 2,
  20.  
    "Sum": 98,
  21.  
    "Max": 77,
  22.  
    "Min": 21,
  23.  
    "Avg": 49
  24.  
    },
  25.  
    {
  26.  
    "Name": "Jack3",
  27.  
    "Count": 2,
  28.  
    "Sum": 126,
  29.  
    "Max": 67,
  30.  
    "Min": 59,
  31.  
    "Avg": 63
  32.  
    }
  33.  
    ]
  34.  
    }
  35.  
    ]
  36.  
    }
学新通
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiGroup":{
  6.  
    "aggs":{
  7.  
    "StatiGroup-1":{
  8.  
    "aggs":{
  9.  
    "StatiSum":{
  10.  
    "sum":{
  11.  
    "field":"UserAge"
  12.  
    }
  13.  
    },
  14.  
    "StatiMax":{
  15.  
    "max":{
  16.  
    "field":"UserAge"
  17.  
    }
  18.  
    },
  19.  
    "StatiMin":{
  20.  
    "min":{
  21.  
    "field":"UserAge"
  22.  
    }
  23.  
    },
  24.  
    "StatiAvg":{
  25.  
    "avg":{
  26.  
    "field":"UserAge"
  27.  
    }
  28.  
    }
  29.  
    },
  30.  
    "terms":{
  31.  
    "field":"UserName",
  32.  
    "order":[
  33.  
    {
  34.  
    "_key":"asc"
  35.  
    },
  36.  
    {
  37.  
    "_count":"asc"
  38.  
    }
  39.  
    ],
  40.  
    "size":2000000000
  41.  
    }
  42.  
    }
  43.  
    },
  44.  
    "date_histogram":{
  45.  
    "field":"CreateTime",
  46.  
    "format":"yyyy-MM-dd HH:mm",
  47.  
    "calendar_interval":"1h",
  48.  
    "min_doc_count":0,
  49.  
    "order":{
  50.  
    "_key":"asc"
  51.  
    },
  52.  
    "time_zone":" 08:00"
  53.  
    }
  54.  
    }
  55.  
    },
  56.  
    "query":{
  57.  
    "bool":{
  58.  
    "must":[
  59.  
    {
  60.  
    "range":{
  61.  
    "Id":{
  62.  
    "gte":1
  63.  
    }
  64.  
    }
  65.  
    }
  66.  
    ]
  67.  
    }
  68.  
    },
  69.  
    "size":0
  70.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "date_histogram#StatiGroup": {
  20.  
    "buckets": [
  21.  
    {
  22.  
    "key_as_string": "2022-10-17 16:00",
  23.  
    "key": 1665993600000,
  24.  
    "doc_count": 75,
  25.  
    "sterms#StatiGroup-1": {
  26.  
    "doc_count_error_upper_bound": 0,
  27.  
    "sum_other_doc_count": 0,
  28.  
    "buckets": [
  29.  
    {
  30.  
    "key": "Jack1",
  31.  
    "doc_count": 2,
  32.  
    "avg#StatiAvg": {
  33.  
    "value": 34.0
  34.  
    },
  35.  
    "max#StatiMax": {
  36.  
    "value": 39.0
  37.  
    },
  38.  
    "min#StatiMin": {
  39.  
    "value": 29.0
  40.  
    },
  41.  
    "sum#StatiSum": {
  42.  
    "value": 68.0
  43.  
    }
  44.  
    },
  45.  
    {
  46.  
    "key": "Jack10",
  47.  
    "doc_count": 1,
  48.  
    "avg#StatiAvg": {
  49.  
    "value": 60.0
  50.  
    },
  51.  
    "max#StatiMax": {
  52.  
    "value": 60.0
  53.  
    },
  54.  
    "min#StatiMin": {
  55.  
    "value": 60.0
  56.  
    },
  57.  
    "sum#StatiSum": {
  58.  
    "value": 60.0
  59.  
    }
  60.  
    },
  61.  
    {
  62.  
    "key": "Jack2",
  63.  
    "doc_count": 2,
  64.  
    "avg#StatiAvg": {
  65.  
    "value": 40.0
  66.  
    },
  67.  
    "max#StatiMax": {
  68.  
    "value": 48.0
  69.  
    },
  70.  
    "min#StatiMin": {
  71.  
    "value": 32.0
  72.  
    },
  73.  
    "sum#StatiSum": {
  74.  
    "value": 80.0
  75.  
    }
  76.  
    },
  77.  
    {
  78.  
    "key": "Jack3",
  79.  
    "doc_count": 2,
  80.  
    "avg#StatiAvg": {
  81.  
    "value": 39.5
  82.  
    },
  83.  
    "max#StatiMax": {
  84.  
    "value": 53.0
  85.  
    },
  86.  
    "min#StatiMin": {
  87.  
    "value": 26.0
  88.  
    },
  89.  
    "sum#StatiSum": {
  90.  
    "value": 79.0
  91.  
    }
  92.  
    },
  93.  
    {
  94.  
    "key": "Jack4",
  95.  
    "doc_count": 2,
  96.  
    "avg#StatiAvg": {
  97.  
    "value": 48.0
  98.  
    },
  99.  
    "max#StatiMax": {
  100.  
    "value": 65.0
  101.  
    },
  102.  
    "min#StatiMin": {
  103.  
    "value": 31.0
  104.  
    },
  105.  
    "sum#StatiSum": {
  106.  
    "value": 96.0
  107.  
    }
  108.  
    },
  109.  
    {
  110.  
    "key": "Jack5",
  111.  
    "doc_count": 2,
  112.  
    "avg#StatiAvg": {
  113.  
    "value": 54.0
  114.  
    },
  115.  
    "max#StatiMax": {
  116.  
    "value": 78.0
  117.  
    },
  118.  
    "min#StatiMin": {
  119.  
    "value": 30.0
  120.  
    },
  121.  
    "sum#StatiSum": {
  122.  
    "value": 108.0
  123.  
    }
  124.  
    },
  125.  
    {
  126.  
    "key": "Jack6",
  127.  
    "doc_count": 1,
  128.  
    "avg#StatiAvg": {
  129.  
    "value": 57.0
  130.  
    },
  131.  
    "max#StatiMax": {
  132.  
    "value": 57.0
  133.  
    },
  134.  
    "min#StatiMin": {
  135.  
    "value": 57.0
  136.  
    },
  137.  
    "sum#StatiSum": {
  138.  
    "value": 57.0
  139.  
    }
  140.  
    },
  141.  
    {
  142.  
    "key": "Jack7",
  143.  
    "doc_count": 1,
  144.  
    "avg#StatiAvg": {
  145.  
    "value": 40.0
  146.  
    },
  147.  
    "max#StatiMax": {
  148.  
    "value": 40.0
  149.  
    },
  150.  
    "min#StatiMin": {
  151.  
    "value": 40.0
  152.  
    },
  153.  
    "sum#StatiSum": {
  154.  
    "value": 40.0
  155.  
    }
  156.  
    },
  157.  
    {
  158.  
    "key": "Jack8",
  159.  
    "doc_count": 1,
  160.  
    "avg#StatiAvg": {
  161.  
    "value": 29.0
  162.  
    },
  163.  
    "max#StatiMax": {
  164.  
    "value": 29.0
  165.  
    },
  166.  
    "min#StatiMin": {
  167.  
    "value": 29.0
  168.  
    },
  169.  
    "sum#StatiSum": {
  170.  
    "value": 29.0
  171.  
    }
  172.  
    },
  173.  
    {
  174.  
    "key": "Jack9",
  175.  
    "doc_count": 1,
  176.  
    "avg#StatiAvg": {
  177.  
    "value": 72.0
  178.  
    },
  179.  
    "max#StatiMax": {
  180.  
    "value": 72.0
  181.  
    },
  182.  
    "min#StatiMin": {
  183.  
    "value": 72.0
  184.  
    },
  185.  
    "sum#StatiSum": {
  186.  
    "value": 72.0
  187.  
    }
  188.  
    },
  189.  
    {
  190.  
    "key": "Quber1",
  191.  
    "doc_count": 7,
  192.  
    "avg#StatiAvg": {
  193.  
    "value": 48.857142857142854
  194.  
    },
  195.  
    "max#StatiMax": {
  196.  
    "value": 79.0
  197.  
    },
  198.  
    "min#StatiMin": {
  199.  
    "value": 21.0
  200.  
    },
  201.  
    "sum#StatiSum": {
  202.  
    "value": 342.0
  203.  
    }
  204.  
    },
  205.  
    {
  206.  
    "key": "Quber10",
  207.  
    "doc_count": 3,
  208.  
    "avg#StatiAvg": {
  209.  
    "value": 31.0
  210.  
    },
  211.  
    "max#StatiMax": {
  212.  
    "value": 43.0
  213.  
    },
  214.  
    "min#StatiMin": {
  215.  
    "value": 20.0
  216.  
    },
  217.  
    "sum#StatiSum": {
  218.  
    "value": 93.0
  219.  
    }
  220.  
    },
  221.  
    {
  222.  
    "key": "Quber11",
  223.  
    "doc_count": 1,
  224.  
    "avg#StatiAvg": {
  225.  
    "value": 29.0
  226.  
    },
  227.  
    "max#StatiMax": {
  228.  
    "value": 29.0
  229.  
    },
  230.  
    "min#StatiMin": {
  231.  
    "value": 29.0
  232.  
    },
  233.  
    "sum#StatiSum": {
  234.  
    "value": 29.0
  235.  
    }
  236.  
    },
  237.  
    {
  238.  
    "key": "Quber12",
  239.  
    "doc_count": 1,
  240.  
    "avg#StatiAvg": {
  241.  
    "value": 74.0
  242.  
    },
  243.  
    "max#StatiMax": {
  244.  
    "value": 74.0
  245.  
    },
  246.  
    "min#StatiMin": {
  247.  
    "value": 74.0
  248.  
    },
  249.  
    "sum#StatiSum": {
  250.  
    "value": 74.0
  251.  
    }
  252.  
    },
  253.  
    {
  254.  
    "key": "Quber2",
  255.  
    "doc_count": 7,
  256.  
    "avg#StatiAvg": {
  257.  
    "value": 51.0
  258.  
    },
  259.  
    "max#StatiMax": {
  260.  
    "value": 78.0
  261.  
    },
  262.  
    "min#StatiMin": {
  263.  
    "value": 25.0
  264.  
    },
  265.  
    "sum#StatiSum": {
  266.  
    "value": 357.0
  267.  
    }
  268.  
    },
  269.  
    {
  270.  
    "key": "Quber3",
  271.  
    "doc_count": 7,
  272.  
    "avg#StatiAvg": {
  273.  
    "value": 48.142857142857146
  274.  
    },
  275.  
    "max#StatiMax": {
  276.  
    "value": 74.0
  277.  
    },
  278.  
    "min#StatiMin": {
  279.  
    "value": 28.0
  280.  
    },
  281.  
    "sum#StatiSum": {
  282.  
    "value": 337.0
  283.  
    }
  284.  
    },
  285.  
    {
  286.  
    "key": "Quber4",
  287.  
    "doc_count": 7,
  288.  
    "avg#StatiAvg": {
  289.  
    "value": 53.285714285714285
  290.  
    },
  291.  
    "max#StatiMax": {
  292.  
    "value": 76.0
  293.  
    },
  294.  
    "min#StatiMin": {
  295.  
    "value": 25.0
  296.  
    },
  297.  
    "sum#StatiSum": {
  298.  
    "value": 373.0
  299.  
    }
  300.  
    },
  301.  
    {
  302.  
    "key": "Quber5",
  303.  
    "doc_count": 7,
  304.  
    "avg#StatiAvg": {
  305.  
    "value": 47.285714285714285
  306.  
    },
  307.  
    "max#StatiMax": {
  308.  
    "value": 70.0
  309.  
    },
  310.  
    "min#StatiMin": {
  311.  
    "value": 25.0
  312.  
    },
  313.  
    "sum#StatiSum": {
  314.  
    "value": 331.0
  315.  
    }
  316.  
    },
  317.  
    {
  318.  
    "key": "Quber6",
  319.  
    "doc_count": 6,
  320.  
    "avg#StatiAvg": {
  321.  
    "value": 41.5
  322.  
    },
  323.  
    "max#StatiMax": {
  324.  
    "value": 78.0
  325.  
    },
  326.  
    "min#StatiMin": {
  327.  
    "value": 20.0
  328.  
    },
  329.  
    "sum#StatiSum": {
  330.  
    "value": 249.0
  331.  
    }
  332.  
    },
  333.  
    {
  334.  
    "key": "Quber7",
  335.  
    "doc_count": 5,
  336.  
    "avg#StatiAvg": {
  337.  
    "value": 43.0
  338.  
    },
  339.  
    "max#StatiMax": {
  340.  
    "value": 61.0
  341.  
    },
  342.  
    "min#StatiMin": {
  343.  
    "value": 21.0
  344.  
    },
  345.  
    "sum#StatiSum": {
  346.  
    "value": 215.0
  347.  
    }
  348.  
    },
  349.  
    {
  350.  
    "key": "Quber8",
  351.  
    "doc_count": 5,
  352.  
    "avg#StatiAvg": {
  353.  
    "value": 42.2
  354.  
    },
  355.  
    "max#StatiMax": {
  356.  
    "value": 61.0
  357.  
    },
  358.  
    "min#StatiMin": {
  359.  
    "value": 22.0
  360.  
    },
  361.  
    "sum#StatiSum": {
  362.  
    "value": 211.0
  363.  
    }
  364.  
    },
  365.  
    {
  366.  
    "key": "Quber9",
  367.  
    "doc_count": 4,
  368.  
    "avg#StatiAvg": {
  369.  
    "value": 54.75
  370.  
    },
  371.  
    "max#StatiMax": {
  372.  
    "value": 65.0
  373.  
    },
  374.  
    "min#StatiMin": {
  375.  
    "value": 39.0
  376.  
    },
  377.  
    "sum#StatiSum": {
  378.  
    "value": 219.0
  379.  
    }
  380.  
    }
  381.  
    ]
  382.  
    }
  383.  
    }
  384.  
    ]
  385.  
    }
  386.  
    }
  387.  
    }
学新通

5.10、🍝 获取总条数、最大、最小、求和或平均值等

使用示例(获取符合条件的数据总条数):

  1.  
    //类似SQL:SELECT COUNT(1) FROM A
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetCount = _quickElasticSearch.GetCount<TestElasticSearchModel>(queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetCountAsync = await _quickElasticSearch.GetCountAsync<TestElasticSearchModel>(queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": 132
  5.  
    }
  1.  
    POST /test_index/_count
  2.  
    {
  3.  
    "query":{
  4.  
    "bool":{
  5.  
    "must":[
  6.  
    {
  7.  
    "range":{
  8.  
    "Id":{
  9.  
    "gte":1
  10.  
    }
  11.  
    }
  12.  
    }
  13.  
    ]
  14.  
    }
  15.  
    }
  16.  
    }
学新通
  1.  
    {
  2.  
    "count": 75,
  3.  
    "_shards": {
  4.  
    "total": 5,
  5.  
    "successful": 5,
  6.  
    "skipped": 0,
  7.  
    "failed": 0
  8.  
    }
  9.  
    }

使用示例(获取某字段的最大值、最小值、求和、平均值和总数等):

  1.  
    //类似SQL:SELECT COUNT(1),SUM(col1),MAX(col1),MIN(col1),AVG(col1) FROM A
  2.  
    //定义查询条件:(Id >= 1)
  3.  
    var queryCon = QuickElasticSearchExtension
  4.  
    //创建条件(默认创建了一个组合条件)
  5.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  6.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  7.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  8.  
    (queryCon) =>
  9.  
    {
  10.  
    //查询条件:(Id >= 1)
  11.  
    queryCon.AddGte(m => m.Id, 1);
  12.  
    });
  13.  
     
  14.  
    //同步
  15.  
    var retGetStatiCount = _quickElasticSearch.GetStatiCount<TestElasticSearchModel>(m => m.UserAge, queryCon);
  16.  
     
  17.  
    //异步
  18.  
    var retGetStatiCountAsync = await _quickElasticSearch.GetStatiCountAsync<TestElasticSearchModel>(m => m.UserAge, queryCon);
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": {
  5.  
    "Count": 132,
  6.  
    "Sum": 6842,
  7.  
    "Max": 79,
  8.  
    "Min": 21,
  9.  
    "Avg": 51.83
  10.  
    }
  11.  
    }
  1.  
    POST /test_index/_search?typed_keys=true
  2.  
    {
  3.  
    "track_total_hits":true,
  4.  
    "aggs":{
  5.  
    "StatiCount":{
  6.  
    "value_count":{
  7.  
    "field":"UserAge"
  8.  
    }
  9.  
    },
  10.  
    "StatiSum":{
  11.  
    "sum":{
  12.  
    "field":"UserAge"
  13.  
    }
  14.  
    },
  15.  
    "StatiMax":{
  16.  
    "max":{
  17.  
    "field":"UserAge"
  18.  
    }
  19.  
    },
  20.  
    "StatiMin":{
  21.  
    "min":{
  22.  
    "field":"UserAge"
  23.  
    }
  24.  
    },
  25.  
    "StatiAvg":{
  26.  
    "avg":{
  27.  
    "field":"UserAge"
  28.  
    }
  29.  
    }
  30.  
    },
  31.  
    "query":{
  32.  
    "bool":{
  33.  
    "must":[
  34.  
    {
  35.  
    "range":{
  36.  
    "Id":{
  37.  
    "gte":1
  38.  
    }
  39.  
    }
  40.  
    }
  41.  
    ]
  42.  
    }
  43.  
    },
  44.  
    "size":0
  45.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "avg#StatiAvg": {
  20.  
    "value": 46.92
  21.  
    },
  22.  
    "max#StatiMax": {
  23.  
    "value": 79.0
  24.  
    },
  25.  
    "value_count#StatiCount": {
  26.  
    "value": 75
  27.  
    },
  28.  
    "min#StatiMin": {
  29.  
    "value": 20.0
  30.  
    },
  31.  
    "sum#StatiSum": {
  32.  
    "value": 3519.0
  33.  
    }
  34.  
    }
  35.  
    }
学新通

使用示例(获取某些字段相加的多个总和):

  1.  
    //类似SQL:SELECT SUM(col1)分类1,SUM(col2 col3 col4)分类2 FROM A
  2.  
    //统计的字段条件
  3.  
    var fieldCons = new List<EsStatisticalSumMultiModel>()
  4.  
    {
  5.  
    new() { AsName="分类1",Fields=new List<string>{ "Money" } },
  6.  
    new() { AsName="分类2",Fields=new List<string>{ "Money", "MoneyOth" } }
  7.  
    };
  8.  
    //定义查询条件:(Id >= 1)
  9.  
    var queryCon = QuickElasticSearchExtension
  10.  
    //创建条件(默认创建了一个组合条件)
  11.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  12.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  13.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  14.  
    (queryCon) =>
  15.  
    {
  16.  
    //查询条件:(Id >= 1)
  17.  
    queryCon.AddGte(m => m.Id, 1);
  18.  
    });
  19.  
     
  20.  
    //同步
  21.  
    var retGetStatiSumMulti = _quickElasticSearch.GetStatiSumMulti<TestElasticSearchModel>(fieldCons, true, queryCon,
  22.  
    (errMsg) =>
  23.  
    {
  24.  
    var thisErrMsg = errMsg;
  25.  
    });
  26.  
     
  27.  
    //异步
  28.  
    var retGetStatiSumMultiAsync = await _quickElasticSearch.GetStatiSumMultiAsync<TestElasticSearchModel>(fieldCons, true, queryCon,
  29.  
    async (errMsg) =>
  30.  
    {
  31.  
    var thisErrMsg = errMsg;
  32.  
     
  33.  
    await Task.CompletedTask;
  34.  
    });
学新通
  1.  
    {
  2.  
    "Item1": true,
  3.  
    "Item2": "",
  4.  
    "Item3": {
  5.  
    "分类1": 754.63,
  6.  
    "分类2": 1658.02
  7.  
    }
  8.  
    }
  1.  
    # 获取某些字段相加的多个总和
  2.  
    # 类似SQL:SELECT SUM(Money)分类1,SUM(Money MoneyOth)分类2 FROM A WHERE Id >= 1
  3.  
    # 此处只是做了一个演示,真正做到上述SQL的统计效果,需要在后台程序处理,也就是说“分类1”和“分类2”是2次请求,分类2这次的请求需要将StatiSumMoney和StatiSumMoneyOth统计的结果相加才能得到最总的总和
  4.  
    POST /test_index/_search?typed_keys=true
  5.  
    {
  6.  
    "track_total_hits":true,
  7.  
    "aggs":{
  8.  
    "StatiSumMoney":{
  9.  
    "sum":{
  10.  
    "field":"Money"
  11.  
    }
  12.  
    },
  13.  
    "StatiSumMoneyOth":{
  14.  
    "sum":{
  15.  
    "field":"MoneyOth"
  16.  
    }
  17.  
    }
  18.  
    },
  19.  
    "query":{
  20.  
    "bool":{
  21.  
    "must":[
  22.  
    {
  23.  
    "range":{
  24.  
    "Id":{
  25.  
    "gte":1
  26.  
    }
  27.  
    }
  28.  
    }
  29.  
    ]
  30.  
    }
  31.  
    },
  32.  
    "size":0
  33.  
    }
学新通
  1.  
    {
  2.  
    "took": 0,
  3.  
    "timed_out": false,
  4.  
    "_shards": {
  5.  
    "total": 5,
  6.  
    "successful": 5,
  7.  
    "skipped": 0,
  8.  
    "failed": 0
  9.  
    },
  10.  
    "hits": {
  11.  
    "total": {
  12.  
    "value": 75,
  13.  
    "relation": "eq"
  14.  
    },
  15.  
    "max_score": null,
  16.  
    "hits": []
  17.  
    },
  18.  
    "aggregations": {
  19.  
    "sum#StatiSumMoneyOth": {
  20.  
    "value": 491.69998598098755
  21.  
    },
  22.  
    "sum#StatiSumMoney": {
  23.  
    "value": 407.17499363422394
  24.  
    }
  25.  
    }
  26.  
    }
学新通

6、💎 Quick.ElasticSearch.Furion 方法

首先通过依赖注入在构造函数中得到IQuickElasticSearch的实例,具体可参照上述文档中的相关示例。

6.1、📔 依赖注入方法

方法名称 方法说明 方法参数 备注
AddElasticSearch 添加依赖注入服务 重载 1:()
重载 2:<T>()
该方法为IServiceCollection的扩展方法,目的是实现IQuickElasticSearch接口的注册。
重载 1 代表注册的是IQuickElasticSearch服务;
重载 2 传入了泛型 T,代表的是注册了IQuickElasticSearch服务的同时,也注册了 T 这个服务(T这个泛型类中,在构造函数中实现了IQuickElasticSearch接口服务,该方法可能在控制台程序使用的情况较多)。
GetInstance 获取某接口服务的实例 重载 1:()
重载 2:()
该方法为IServiceProviderIHost的扩展方法,目的是获取某接口或类的实例。
重载 1 是基于IServiceProvider的扩展;
重载 2 是基于IHost的扩展。

6.2、💸 获取 ElasticSearch 客户端

方法名称 方法说明 方法参数 返回值 备注
GetClient 获取 ElasticSearch 客户端 () 返回 ElasticClient 对象  

6.3、📕 切换连接方法

方法名称 方法说明 方法参数 返回值 备注
ChangeConn 切换连接 (int connId) 切换配置文件中某个连接配置,connId 为连接 Id

6.4、📗 获取检查创建删除索引方法

方法名称 方法说明 方法参数 返回值 备注
GetIndexs 获取所有索引 (bool isIncludeSystemIndex = false) List<CatIndicesRecord> isIncludeSystemIndex:是否包含系统索引
GetIndexsAsync 获取所有索引(异步) (bool isIncludeSystemIndex = false) List<CatIndicesRecord> isIncludeSystemIndex:是否包含系统索引
IndexIsExist 检查索引是否存在 (string indexName) 返回 bool 类型 indexName:索引名称
IndexIsExistAsync 检查索引是否存在(异步) (string indexName) 返回 bool 类型 indexName:索引名称
CreateIndex 如果同名索引不存在则创建索引 <T>(int numberOfReplicas = 0, int numberOfShards = 5) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 numberOfReplicas:默认副本数量,如果是单实例,注意改成 0
numberOfShards:默认分片数量
CreateIndexAsync 如果同名索引不存在则创建索引(异步) <T>(int numberOfReplicas = 0, int numberOfShards = 5) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息  
DeleteIndex 删除索引 (string indexName) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 indexName:索引名称
DeleteIndexAsync 删除索引(异步) (string indexName) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 indexName:索引名称

6.5、📘 获取索引健康状态方法

方法名称 方法说明 方法参数 返回值 备注
GetHealthStatus 获取索引健康状态 (string indexName) 返回 Health 枚举对象(Green:0、Yellow:1、Red:2) indexName:索引名称
GetHealthStatusAsync 获取索引健康状态 (string indexName) 返回 Health 枚举对象(Green:0、Yellow:1、Red:2) indexName:索引名称

6.6、📙 添加数据方法

方法名称 方法说明 方法参数 返回值 备注
InsertModel 添加一条数据 <T>(T docData) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docData:数据
InsertModelAsync 添加一条数据(异步) <T>(T docData) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docData:数据
InsertModels 添加多条数据 <T>(List<T> docDatas, Action<List<T>, string, List<T>>? insertError = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docDatas:数据
insertError:错误回调方法(参数 1 为出错的数据集合,参数 2 为出错的提示信息,参数 3 为修改的所有数据集合)
InsertModelsAsync 添加多条数据(异步) <T>(List<T> docDatas, Action<List<T>, string, List<T>>? insertError = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docDatas:数据
insertError:错误回调方法(参数 1 为出错的数据集合,参数 2 为出错的提示信息,参数 3 为修改的所有数据集合)
InsertModelsBatch 添加多条数据(分批次) <T>(List<T> docDatas, Action<List<T>, string, List<T>>? insertError = null, int? batchCount = 1000, string backOffTime = "30s", int? backOffRetries = 5) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docDatas:数据
insertError:错误回调方法(参数 1 为出错的数据集合,参数 2 为出错的提示信息,参数 3 为修改的所有数据集合)
batchCount:每批次添加的数据条数
backOffTime:集群繁忙,报 429 错误码的时候,等待多久进行重试,默认为:30s
backOffRetries:重试次数,默认为:5 次

6.7、📚 修改数据方法

方法名称 方法说明 方法参数 返回值 备注
UpdateModelFieldsById 根据主键 Id 修改一个或多个字段的值 <T>(object id, object updateObj) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
id:主键 Id 值
updateObj:修改的动态对象,格式如:new { col1 = 123, col2 = 456},需要注意的是,填写的字段一定要和实体一致,如果修改的字段在数据中不存在,会自动增加这个字段的
UpdateModelFieldsByIdAsync 根据主键 Id 修改一个或多个字段的值(异步) <T>(object id, object updateObj) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
id:主键 Id 值
updateObj:修改的动态对象,格式如:new { col1 = 123, col2 = 456},需要注意的是,填写的字段一定要和实体一致,如果修改的字段在数据中不存在,会自动增加这个字段的
UpdateModelFieldsByCon 根据查询条件修改一个或多个字段的值 <T>(List<EsQueryModel<T>> esQueryList, object updateObj) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
esQueryList:动态查询条件
updateObj:修改的动态对象,格式如:new { col1 = 123, col2 = 456},需要注意的是,填写的字段一定要和实体一致,如果修改的字段在数据中不存在,会自动增加这个字段的
UpdateModelFieldsByConAsync 根据查询条件修改一个或多个字段的值(异步) <T>(List<EsQueryModel<T>> esQueryList, object updateObj) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
esQueryList:动态查询条件
updateObj:修改的动态对象,格式如:new { col1 = 123, col2 = 456},需要注意的是,填写的字段一定要和实体一致,如果修改的字段在数据中不存在,会自动增加这个字段的
UpdateModel 修改一条数据 <T>(T docData) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docData:数据
UpdateModelAsync 修改一条数据(异步) <T>(T docData) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docData:数据
UpdateModels 修改多条数据 <T>(List<T> docDatas, Action<List<T>, string, List<T>>? updateError = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docDatas:数据
updateError:错误回调方法(参数 1 为出错的数据集合,参数 2 为出错的提示信息,参数 3 为修改的所有数据集合)
UpdateModelsAsync 修改多条数据(异步) <T>(List<T> docDatas, Action<List<T>, string, List<T>>? updateError = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
docDatas:数据
updateError:错误回调方法(参数 1 为出错的数据集合,参数 2 为出错的提示信息,参数 3 为修改的所有数据集合)

6.8、📓 删除数据方法

方法名称 方法说明 方法参数 返回值 备注
DeleteModel 删除数据(根据 Id 字段) <T>(object dataId) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
dataId:要删除的数据 ID
DeleteModelAsync 删除数据(根据 Id 字段,异步) <T>(object dataId) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 T:泛型对象
dataId:要删除的数据 ID
DeleteModelBy 删除符合条件的所有数据 <T>(List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 params:动态查询条件
DeleteModelByAsync 删除符合条件的所有数据(异步) <T>(List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 2 个值,第一个为是否成功,第二个为失败的提示信息 params:动态查询条件

6.9、📒 获取数据方法

方法名称 方法说明 方法参数 返回值 备注
GetModelsAll 获取所有数据 <T>(Expression<Func<T, object>>? field = null, bool isDesc = true) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<T>的集合 T:泛型对象
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
GetModelsAllAsync 获取所有数据(异步) <T>(Expression<Func<T, object>>? field = null, bool isDesc = true) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<T>的集合 T:泛型对象
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
GetModels 获取匹配条件的所有数据 <T>(Expression<Func<T, object>>? field = null, bool isDesc = true, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<T>的集合 T:泛型对象
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
esQueryList:动态查询条件
GetModelsAsync 获取匹配条件的所有数据(异步) <T>(Expression<Func<T, object>>? field = null, bool isDesc = true, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<T>的集合 T:泛型对象
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
esQueryList:动态查询条件
GetModelsFields 获取匹配条件的所有数据(返回指定字段的值) <T>(List<string> speFields, Expression<Func<T, object>>? field = null, bool isDesc = true, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合 T:泛型对象
speFields:只返回设置字段的值,如:new List<string> { "SampleId", "SampleName" }
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
esQueryList:动态查询条件
GetModelsFieldsAsync 获取匹配条件的所有数据(返回指定字段的值,异步) <T>(List<string> speFields, Expression<Func<T, object>>? field = null, bool isDesc = true, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合 T:泛型对象
speFields:只返回设置字段的值,如:new List<string> { "SampleId", "SampleName" }
field:排序字段,格式如:m => m.OptTime
isDesc:是否为降序(默认为降序)
esQueryList:动态查询条件
GetModel 获取一条数据(根据某字段执行等于查询) <T>(Expression<Func<T, object>> field, object fieldVal) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 T 的数据对象 T:泛型对象
field:查询的字段
fieldVal:查询的字段对应的值
GetModelAsync 获取一条数据(根据某字段执行等于查询,异步) <T>(Expression<Func<T, object>> field, object fieldVal) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 T 的数据对象 T:泛型对象
field:查询的字段
fieldVal:查询的字段对应的值
GetPagerAsync 获取分页数据 <T>(EsPagerConModel esPagerCon, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 EsPagerModel<T>的数据对象 T:泛型对象
esPagerCon:分页条件
esQueryList:动态查询条件
GetPagerAsync 获取分页数据(异步) <T>(EsPagerConModel esPagerCon, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 EsPagerModel<T>的数据对象 T:泛型对象
esPagerCon:分页条件
esQueryList:动态查询条件
GetPagerFields 获取分页数据(返回指定字段的值) <T>(EsPagerConModel esPagerCon, List<string> speFields, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 EsPagerDicModel 的数据对象 T:泛型对象
esPagerCon:分页条件
speFields:只返回设置字段的值,如:new List<string> { "SampleId", "SampleName" }
esQueryList:动态查询条件
GetPagerFieldsAsync 获取分页数据(返回指定字段的值,异步) <T>(EsPagerConModel esPagerCon, List<string> speFields, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 EsPagerDicModel 的数据对象 T:泛型对象
esPagerCon:分页条件
speFields:只返回设置字段的值,如:new List<string> { "SampleId", "SampleName" }
esQueryList:动态查询条件

6.10、📋 分组统计查询方法

方法名称 方法说明 方法参数 返回值 备注
GetGroupValues 单个字段分组,并返回该字段的所有值集合 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<string>的集合,格式如:["分类 1","分类 2"] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
esQueryList:动态查询条件
GetGroupValuesAsync 单个字段分组,并返回该字段的所有值集合,异步 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<string>的集合,格式如:["分类 1","分类 2"] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
esQueryList:动态查询条件
GetGroupCount 单个字段分组,并返回该字段的所有值和数量集合 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"分类 1","Count":100}] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
esQueryList:动态查询条件
GetGroupCountAsync 单个字段分组,并返回该字段的所有值和数量集合,异步 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"分类 1","Count":100}] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
esQueryList:动态查询条件
GetGroupCountSmma 单个字段分组,并返回另一个字段的总和、最大值、最小值和平均值 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"分类 1","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
fieldStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.col2
esQueryList:动态查询条件
GetGroupCountSmmaAsync 单个字段分组,并返回另一个字段的总和、最大值、最小值和平均值,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"分类 1","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段,格式如:m=>m.col1
fieldStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.col2
esQueryList:动态查询条件
GetGroupsCount 多个字段分组 <T>(List<string> groupFields, List<EsQueryModel<T>>? esQueryList = null, string countKeyName = "GroupCount") 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"col1":"val1","col2":"val2","GroupCount":100}] T:泛型对象
groupFields:要分组的字段集合,如:new List<string> { "col1", "col2" }
esQueryList:动态查询条
countKeyName:返回统计数量的 Key 名称,默认为:GroupCount 件
GetGroupsCountAsync 多个字段分组,异步 <T>(List<string> groupFields, List<EsQueryModel<T>>? esQueryList = null, string countKeyName = "GroupCount") 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"col1":"val1","col2":"val2","GroupCount":100}] T:泛型对象
groupFields:要分组的字段集合,如:new List<string> { "col1", "col2" }
esQueryList:动态查询条
countKeyName:返回统计数量的 Key 名称,默认为:GroupCount 件
GetGroupsDateMonth 日期字段分组,按月统计 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
esQueryList:动态查询条件
GetGroupsDateMonthAsync 日期字段分组,按月统计,异步 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
esQueryList:动态查询条件
GetGroupsDate 日期字段分组,支持按年、季度、月份、星期、天、小时、分、秒等维度进行统计 <T>(Expression<Func<T, object>> field, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件
GetGroupsDateAsync 日期字段分组,支持按年、季度、月份、星期、天、小时、分、秒等维度进行统计,异步 <T>(Expression<Func<T, object>> field, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件
GetGroupsDateMonthSmma 日期字段分组,按月统计,并返回另一个字段的总和、最大值、最小值和平均值 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroupStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
esQueryList:动态查询条件
GetGroupsDateMonthSmmaAsync 日期字段分组,按月统计,并返回另一个字段的总和、最大值、最小值和平均值,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroupStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
esQueryList:动态查询条件
GetGroupsDateSmma 日期字段分组,并返回另一个字段的总和、最大值、最小值和平均值 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroupStati, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件
GetGroupsDateSmmaAsync 日期字段分组,并返回另一个字段的总和、最大值、最小值和平均值,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroupStati, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Sum":999,"Max":200,"Min":10,"Avg":105}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件
GetGroupsDateMonthOneYear 日期字段分组,按某年 1~12 月统计每个月的某个字段每个月的总和以及这一年的总和 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, int year, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为分组统计数组,格式如:[["小米",3006,0,0,0,1100,0,0,0,1200,0,0,0,5306]],其中第一个值为 fieldGroup 的分组名称;后面第二个到第十三个值为 1~12 月份的总和;第十四个值为 1~12 月份的总和 T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
year:统计的年份,如 2021
esQueryList:动态查询条件
GetGroupsDateMonthOneYearAsync 日期字段分组,按某年 1~12 月统计每个月的某个字段每个月的总和以及这一年的总和,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, int year, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为分组统计数组,格式如:[["小米",3006,0,0,0,1100,0,0,0,1200,0,0,0,5306]],其中第一个值为 fieldGroup 的分组名称;后面第二个到第十三个值为 1~12 月份的总和;第十四个值为 1~12 月份的总和 T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
year:统计的年份,如 2021
esQueryList:动态查询条件
GetGroupsDateMonth 日期字段分组,按月统计,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Group":[{"Name":"碎石","Count":3,"Sum":1000,"Max":100,"Min":10,"Avg":50}]}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
esQueryList:动态查询条件
GetGroupsDateMonthAsync 日期字段分组,按月统计,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Group":[{"Name":"碎石","Count":3,"Sum":1000,"Max":100,"Min":10,"Avg":50}]}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
esQueryList:动态查询条件
GetGroupsDateSub 日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Group":[{"Name":"碎石","Count":3,"Sum":1000,"Max":100,"Min":10,"Avg":50}]}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件
GetGroupsDateSubAsync 日期字段分组,并按照另一个字段进行分组,统计其条数、总和、最大值、最小值和平均值,异步 <T>(Expression<Func<T, object>> field, Expression<Func<T, object>> fieldGroup, Expression<Func<T, object>> fieldGroupStati, string dateInterval = "1M", string dateFormat = "yyyy-MM", List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为 List<Dictionary<string, object>>的集合,格式如:[{"Name":"2021-01","Count":100,"Group":[{"Name":"碎石","Count":3,"Sum":1000,"Max":100,"Min":10,"Avg":50}]}] T:泛型对象
field:要分组的字段(日期字段),格式如:m=>m.CreateTime
fieldGroup:另一个要分组的字段,格式如:m=>m.TypeName
fieldGroupStati:要统计总和、最大值、最小值和平均值的字段,格式如:m=>m.Price
dateInterval:统计的日期间隔,默认为 1M(支持的表达式有 1y:1 年、1q:1 季度、1M:1 个月、1w:1 星期、1d:1 天、1h:1 小时、1m:1 分钟、1s:1 秒钟)
dateFormat:统计的日期格式化方式,默认为 yyyy-MM(注意大小写,完整的格式化格式为 yyyy-MM-dd HH:mm:ss)
esQueryList:动态查询条件

6.11、📜 获取总条数、最大、最小、求和或平均值等方法

方法名称 方法说明 方法参数 返回值 备注
GetCount 获取符合条件的数据总条数 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为总条数 T:泛型对象
esQueryList:动态查询条件
GetCountAsync 获取符合条件的数据总条数(异步) <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为总条数 T:泛型对象
esQueryList:动态查询条件
GetStatiCount 获取某字段的最大值、最小值、求和、平均值和总数等 <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为统计数据,格式为{"Count":100,"Sum":999,"Max":150,"Min":10,"Avg":200} T:泛型对象
field:要求和、最大值、最小值和平均值的字段 B,格式如:m=>m.col1
esQueryList:动态查询条件
GetStatiCountAsync 获取某字段的最大值、最小值、求和、平均值和总数等(异步) <T>(Expression<Func<T, object>> field, List<EsQueryModel<T>>? esQueryList = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为统计数据,格式为{"Count":100,"Sum":999,"Max":150,"Min":10,"Avg":200} T:泛型对象
field:要求和、最大值、最小值和平均值的字段 B,格式如:m=>m.col1
esQueryList:动态查询条件
GetStatiSumMulti 获取某些字段相加的多个总和 <T>(List<EsStatisticalSumMultiModel> fieldCons, bool is2Dec, List<EsQueryModel<T>>? esQueryList = null, Action<string>? error = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为统计数据,格式为{"分类 1":100,"分类 2":200} T:泛型对象
fieldCons:统计的某些字段多个总和的条件集合
is2Dec:是否将总和结果保留 2 为小数,false 则将保持原小数返回
esQueryList:动态查询条件
error:错误回调方法(参数 1 为出错的提示信息)
GetStatiSumMultiAsync 获取某些字段相加的多个总和(异步) <T>(List<EsStatisticalSumMultiModel> fieldCons, bool is2Dec, List<EsQueryModel<T>>? esQueryList = null, Func<string, Task>? error = null) 返回元组对象,包含 3 个值,第一个为是否成功,第二个为失败的提示信息,第三个为统计数据,格式为{"分类 1":100,"分类 2":200} T:泛型对象
fieldCons:统计的某些字段多个总和的条件集合
is2Dec:是否将总和结果保留 2 为小数,false 则将保持原小数返回
esQueryList:动态查询条件
error:错误回调方法(参数 1 为出错的提示信息)

6.12、💰 查询条件

在上面的方法中,基本都涉及到了关于查询条件(List<EsQueryModel<T>>? esQueryList = null)的参数,在此专门对查询条件的使用进行说明。

创建查询条件:

我们使用QuickElasticSearchExtension.CreateEsQueryModel<T>静态方法来创建一个查询条件集合对象,如下所示:

  1.  
    //创建查询条件集合对象
  2.  
    //CreateEsQueryModel方法需要传入泛型T,第一个参数代表和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)、第二个参数代表当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)、第三个参数代表当前组合查询条件的回调函数,用于添加具体条件
  3.  
    //下述代表的是创建了一个查询条件集合对象queryCon,并且设置了该对象第一个集合中的2个查询条件,类似SQL:(Id >= 340506710462542 AND UserAge <= 60)
  4.  
    var queryCon = QuickElasticSearchExtension
  5.  
    //创建条件(默认创建了一个组合条件)
  6.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  7.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  8.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  9.  
    (queryCon) =>
  10.  
    {
  11.  
    //查询条件:(Id >= 340506710462542 AND UserAge <= 60)
  12.  
    queryCon
  13.  
    .AddGte(m => m.Id, 340506710462542)
  14.  
    .AddLte(m => m.UserAge, 60);
  15.  
    });
学新通

组合条件:

上述的例子,我们只声明了一个组合条件,如果需要多个组合条件一起使用,则直接调用AddEsQueryModel方法继续添加组合条件即可(该方法为上述创建的条件集合对象queryCon的扩展方法【链式操作】),该方法的参数和CreateEsQueryModel一模一样,如下所示的代码代表(Id 大于或等于 340506710462542 并且 UserAge 小于或等于 60) 或者(Id 等于 340506710462539 或者 Id 等于 340506710462538)

  1.  
    var queryCon = QuickElasticSearchExtension
  2.  
    //创建条件(默认创建了一个组合条件)
  3.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  4.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  5.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  6.  
    (queryCon) =>
  7.  
    {
  8.  
    //查询条件:(Id >= 340506710462542 AND UserAge <= 60)
  9.  
    queryCon
  10.  
    .AddGte(m => m.Id, 340506710462542)
  11.  
    .AddLte(m => m.UserAge, 60);
  12.  
    })
  13.  
    //添加另一个组合条件
  14.  
    .AddEsQueryModel(
  15.  
    EsQueryType.Or,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  16.  
    EsQueryType.Or,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  17.  
    (queryCon) =>
  18.  
    {
  19.  
    //查询条件:(Id = 340506710462539 OR Id = 340506710462538)
  20.  
    queryCon
  21.  
    .AddEqu(m => m.Id, 340506710462539)
  22.  
    .AddEqu(m => m.Id, 340506710462538);
  23.  
    });
  24.  
     
  25.  
    //同步
  26.  
    var retDeleteModelBy = _quickElasticSearch.DeleteModelBy<TestElasticSearchModel>(queryCon);
  27.  
     
  28.  
    //异步
  29.  
    var retDeleteModelByAsync = await _quickElasticSearch.DeleteModelByAsync<TestElasticSearchModel>(queryCon);
学新通

更多条件:

如果我们想添加更多条件,直接使用方法AddEsQueryModel追加即可,如下所示:

  1.  
    var queryCon = QuickElasticSearchExtension
  2.  
    //创建条件(默认创建了一个组合条件)
  3.  
    .CreateEsQueryModel<TestElasticSearchModel>(……,……,……)
  4.  
     
  5.  
    //第二个组合条件
  6.  
    .AddEsQueryModel(……,……,……)
  7.  
     
  8.  
    //第三个组合条件
  9.  
    .AddEsQueryModel(……,……,……)
  10.  
     
  11.  
    //第四个组合条件
  12.  
    .AddEsQueryModel(……,……,……)
  13.  
     
  14.  
    //第五个组合条件
  15.  
    .AddEsQueryModel(……,……,……)
  16.  
     
  17.  
    //第n个组合条件
  18.  
    .……;
学新通

EsQueryModel 说明:

  • PrevConType:和上一个 EsQueryModel 之间的连接类型(AND 或 OR 操作,默认为 AND 操作);
  • QueryType:查询条件集合的连接类型,针对 QueryCon 而言(AND 或 OR 操作,默认为 AND 操作);
  • QueryCon:查询条件集合。

查询条件扩展方法:

方法名称 方法说明 方法参数 返回值 备注
CreateEsQueryModel 创建查询条件集合对象 (EsQueryType prevConType = EsQueryType.And, EsQueryType queryType = EsQueryType.And, Action<List<Func<QueryContainerDescriptor<T>, QueryContainer>>>? queryConAction = null) List<EsQueryModel<T>> T:泛型对象
prevConType:和上一个 EsQueryModel 之间的连接类型(AND 或 OR 操作,默认为 AND 操作)
queryType:当前组合查询条件集合的连接类型,针对 QueryCon 而言(AND 或 OR 操作,默认为 AND 操作)
queryConAction:当前组合查询条件的回调函数,用于添加具体条件
AddEsQueryModel 添加查询条件 <T>(this List<EsQueryModel<T>> queryModels, EsQueryType prevConType = EsQueryType.And, EsQueryType queryType = EsQueryType.And, Action<List<Func<QueryContainerDescriptor<T>, QueryContainer>>>? queryConAction = null) List<EsQueryModel<T>> T:泛型对象
prevConType:和上一个 EsQueryModel 之间的连接类型(AND 或 OR 操作,默认为 AND 操作)
queryType:当前组合查询条件集合的连接类型,针对 QueryCon 而言(AND 或 OR 操作,默认为 AND 操作)
queryConAction:当前组合查询条件的回调函数,用于添加具体条件
         
GetSort 获取排序条件 <T>(string field, bool isDesc = true) Func<SortDescriptor<T>, SortDescriptor<T>> T:泛型对象
field:排序字段
isDesc:是否为降序(默认为降序)
GetSort 获取排序条件 <T>(string field, bool isDesc = true) Func<SortDescriptor<T>, SortDescriptor<T>> T:泛型对象
field:排序字段
isDesc:是否为降序(默认为降序)
CreateAndOrs 创建 AND 或 OR 条件集合 <T>() List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
使用示例:var queryCon = QuickElasticSearchExtension.CreateAndOrs<T>();
AddEqu 添加等于查询条件= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, object value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddEqu(m => m.Id, "7");
AddIn 添加 IN 查询条件 <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, List<object> values) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
values:查询的具体值
使用示例:queryCon.AddNotEqu(m => m.Id, new List<object>{"7","21","28"});
AddNotEqu 添加不等于查询条件= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, object value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddNotEqu(m => m.Id, "7");
AddNotEqu 添加不等于查询条件= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, List<object> values) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
values:查询的具体值
使用示例:queryCon.AddNotEqu(m => m.Id, new List<object>{"7","21","28"});
AddLike 添加模糊查询条件 LIKE <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> fields, string value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
fields:字段表达式,如:m => m.Id 或 m=>new [] {m.EngPart, m.TestType}
value:查询的关键字
使用示例:queryCon.AddLike(m => m.EngPart, "测试的关键字");
AddGt 添加大于查询条件> <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, double value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddGt(m => m.Id, 28);
AddGt 添加大于查询条件> <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, DateTime value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.CreateTime
value:查询的具体值
使用示例:queryCon.AddGt(m => m.CreateTime, "2022-10-12 14:10:26");
AddGte 添加大于或等于查询条件>= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, double value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddGte(m => m.Id, 28);
AddGte 添加大于或等于查询条件>= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, DateTime value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.CreateTime
value:查询的具体值
使用示例:queryCon.AddGte(m => m.CreateTime, "2022-10-12 14:10:26");
AddLt 添加小于查询条件< <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, double value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddLt(m => m.Id, 28);
AddLt 添加小于查询条件< <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, DateTime value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.CreateTime
value:查询的具体值
使用示例:queryCon.AddLt(m => m.CreateTime, "2022-10-12 14:10:26");
AddLte 添加小于或等于查询条件<= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, double value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.Id
value:查询的具体值
使用示例:queryCon.AddLte(m => m.Id, 28);
AddLte 添加小于或等于查询条件<= <T>(this List<Func<QueryContainerDescriptor<T>, QueryContainer>> andOrCons, Expression<Func<T, object>> field, DateTime value) List<Func<QueryContainerDescriptor<T>, QueryContainer>> T:泛型对象
field:字段表达式,如:m => m.CreateTime
value:查询的具体值
使用示例:queryCon.AddLte(m => m.CreateTime, "2022-10-12 14:10:26");

分页查询条件:

我们在使用分页方法的时候,第一个参数需要传入分页查询参数EsPagerConModel,如下所示:

  1.  
    //分页条件
  2.  
    var pagerCon = new EsPagerConModel
  3.  
    {
  4.  
    PageIndex = 1,
  5.  
    PageSize = 15,
  6.  
    OrderField = "Id",
  7.  
    OrderType = "desc"
  8.  
    };
  9.  
     
  10.  
    //定义查询条件:(Id >= 1)
  11.  
    var queryCon = QuickElasticSearchExtension
  12.  
    //创建条件(默认创建了一个组合条件)
  13.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  14.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  15.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  16.  
    (queryCon) =>
  17.  
    {
  18.  
    //查询条件:(Id >= 1)
  19.  
    queryCon.AddGte(m => m.Id, 1);
  20.  
    });
  21.  
     
  22.  
    //同步
  23.  
    var retGetPager = _quickElasticSearch.GetPager<TestElasticSearchModel>(pagerCon, queryCon);
  24.  
     
  25.  
    //异步
  26.  
    var retGetPagerAsync = await _quickElasticSearch.GetPagerAsync<TestElasticSearchModel>(pagerCon, queryCon);
学新通

EsPagerConModel 说明:

  • PageIndex:当前页码(默认为 1);
  • PageSize:当前页数量(默认为 15);
  • OrderField:排序字段;
  • OrderType:排序方式(默认为 desc)。

统计查询条件:

我们在使用GetStatiSumMultiGetStatiSumMultiAsync方法获取某些字段相加的多个总和的统计的时候,第一个参数需要传入EsStatisticalSumMultiModel,如下所示:

  1.  
    //类似SQL:SELECT SUM(col1)分类1,SUM(col2 col3 col4)分类2 FROM A
  2.  
     
  3.  
    //统计的字段条件
  4.  
    var fieldCons = new List<EsStatisticalSumMultiModel>()
  5.  
    {
  6.  
    new() { AsName="分类1",Fields=new List<string>{ "Money" } },
  7.  
    new() { AsName="分类2",Fields=new List<string>{ "Money", "MoneyOth" } }
  8.  
    };
  9.  
     
  10.  
    //定义查询条件:(Id >= 1)
  11.  
    var queryCon = QuickElasticSearchExtension
  12.  
    //创建条件(默认创建了一个组合条件)
  13.  
    .CreateEsQueryModel<TestElasticSearchModel>(
  14.  
    EsQueryType.And,//和上一个EsQueryModel之间的连接类型(AND或OR操作,默认为AND操作)
  15.  
    EsQueryType.And,//当前组合查询条件集合的连接类型,针对QueryCon而言(AND或OR操作,默认为AND操作)
  16.  
    (queryCon) =>
  17.  
    {
  18.  
    //查询条件:(Id >= 1)
  19.  
    queryCon.AddGte(m => m.Id, 1);
  20.  
    });
  21.  
     
  22.  
    //同步
  23.  
    var retGetStatiSumMulti = _quickElasticSearch.GetStatiSumMulti<TestElasticSearchModel>(fieldCons, true, queryCon,
  24.  
    (errMsg) =>
  25.  
    {
  26.  
    var thisErrMsg = errMsg;
  27.  
    });
  28.  
     
  29.  
    //异步
  30.  
    var retGetStatiSumMultiAsync = await _quickElasticSearch.GetStatiSumMultiAsync<TestElasticSearchModel>(fieldCons, true, queryCon,
  31.  
    async (errMsg) =>
  32.  
    {
  33.  
    var thisErrMsg = errMsg;
  34.  
     
  35.  
    await Task.CompletedTask;
  36.  
    });
学新通

EsStatisticalSumMultiModel 说明:

  • AsName(string):某几个字段相加总和最后返回的 Key 名称;
  • Fields(List<string>):某几个字段相加的字段集合。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgggfkg
系列文章
更多 icon
同类精品
更多 icon
继续加载