Elastic学习之旅 (12) .NET 6应用集成ES - 下
大家好,我是Edison。
上一篇:.NET集成ES进行CRUD
写在开头
在.NET应用中集成ES一般涉及两个方面:
(1)将ES当存储用,类似于MongoDB,做文档的增删查改,这一类操作偏CRUD。
(2)对ES中的数据做查询分析,聚合统计、分组等等,这一类操作偏查询分析。
上一篇我们了解了CRUD,我们今天再来搞定查询和聚合作为本系列的结尾!
增加模型
为了进行今天的查询和聚合,我们在上一篇的demo项目中增加一个Product模型。都是常规字段,就不再解释了。
public class Product : ElasticModelBase
{
public string Ean { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Brand { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public DateTime ReleaseDate { get; set; }
}
与此同时,新增一个ProductRepository:
public class ProductRepository : ElasticRepositoryBase<Product>, IProductRepository
{
public ProductRepository(IElasticProxy elasticProxy) : base(elasticProxy)
{
} protected override string IndexName => "products";
}
分页查询
我们在上一篇的demo项目中其实已经做了分页查询的基础实现了:
public virtual async Task<Tuple<int, IList<T>>> QueryAsync(int page, int limit)
{
var query = await this.Client.SearchAsync<T>(x => x.Index(this.IndexName)
.From((page -1) * limit)
.Size(limit)); return new Tuple<int, IList<T>>(Convert.ToInt32(query.Total), query.Documents.ToList());
}
但很多时候我们还想要根据某个字段排序,我们可以在上一篇的基类的基础上重写一下,在ProductRepository就可以实现:
public override async Task<Tuple<int, IList<Product>>> QueryAsync(int page, int limit)
{
var query = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.From((page - 1) * limit)
.Size(limit)
.Sort(x => x.Descending(v => v.ReleaseDate))); return new Tuple<int, IList<Product>>(Convert.ToInt32(query.Total), query.Documents.ToList());
}
条件查询(基于Term)
我们在之前的学习中学习了结构化搜索主要是通过Term来进行查询,那么假如我们想要根据EAN字段来查询某个product,则可以在ProductRepository中新增一个方法来实现:
public async Task<IList<Product>> QueryByEanAsync(string ean)
{
var result = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.Query(q => q.Term(p => p.Ean, ean)));
return result.Documents.ToList();
}
一般来说,Query的结果默认是document集合。这里我们测试结果如下:

那么,如果是多条件查询呢?比如:根据一个key查询EAN或Name,这就是多个Term的Or查询:
public async Task<IList<Product>> QueryByEanOrNameAsync(string key)
{
var result = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.Query(q => q.Term(p => p.Ean, key) || q.Term(p => p.Name, key)));
return result.Documents.ToList();
}
比如:根据一个key查询Name并只筛选Status="Active"的product,这就是多个Term的And查询:
public async Task<IList<Product>> GetActiveProductsByNameAsync(string key)
{
var result = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.Query(q => q.Term(p => p.Name, key) && q.Term(p => p.Status, "Active")));
return result.Documents.ToList();
}
聚合统计
我们在之前的学习中学习了聚合查询,那么这里我们通过聚合来统计一下Product数据中Price字段的最大值、最小值和平均值:
public async Task<Nest.AggregateDictionary> QueryPriceAggAsync()
{
var searchResult = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.Size(0) // 代表不返回源数据
.Aggregations(agg => agg.Average("price_avg", avg => avg.Field("price"))
.Max("price_max", max => max.Field("price"))
.Min("price_min", min => min.Field("price")))
);
return searchResult.Aggregations;
}
聚合分组
如果我们想要根据某个字段分组查询product数据,那么可以使用聚合分组:
public async Task<Nest.AggregateDictionary> QueryBrandAggAsync()
{
var searchResult = await this.Client.SearchAsync<Product>(x => x.Index(this.IndexName)
.Size(0) // 代表不返回源数据
.Aggregations(agg => agg.Terms("brandgroup", group => group.Field("brand"))
));
return searchResult.Aggregations;
}
小结
本篇,我们了解了如何在ASP.NET 6应用中对ES中的数据进行查询 和 聚合,通过使用这些查询我们可以在应用中实现一些报表功能。到此,本系列的学习之旅就要跟大家说声再见了,12篇说多不多,持续输出就是坚持,希望对你学习ElasticSearch有所帮助。
示例代码
Github:https://github.com/Coder-EdisonZhou/ElasticSamples
参考资料
博客园,包子wxl,《ElasticSearch使用系列-.NET6对接ES》
CSDN,阿星Plus,《.NET Core下使用ES》
CSDN,风神.NET,《如何在ASP.NET Core中集成ES》
极客时间,阮一鸣,《ElasticSearch核心技术与实战》

Elastic学习之旅 (12) .NET 6应用集成ES - 下的更多相关文章
- python学习之旅1-2(基础知识)
三,python基础初识. 1.运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确定后 写入代码pytho ...
- 笔记-JavaWeb学习之旅12
会话技术 Cookie:客户端会话技术,将数据保存到客户端 package com.data.Cookie; import javax.servlet.ServletException; import ...
- Spring MVC学习总结(12)——Spring MVC集成Swagger时报错{"schemaValidationMessages":[
在springmvc结合swagger的时候,如果将项目部署到服务器上就会出现问题出现下面的图标: 点开会报错误信息: schemaValidationMessages":[{"l ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- WCF学习之旅—实现支持REST客户端应用(二十四)
WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...
- WCF学习之旅—WCF第二个示例(五)
二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...
- 开发了5年android,我开始了go学习之旅
前言 做了近5年的android开发,最近项目也是不怎么忙,空闲的时候总会思考一些事情,不过作为移动开发,我个人觉得很有必要学习后台开发,由于公司是Go语言开发的,了解go语言一段时间后,我发现go语 ...
- SSIS 学习之旅 FTP文件传输-脚本任务
这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计: 通过Demon库的Users表数据生成CSV文件. 生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...
- SSIS 学习之旅 FTP文件传输-FTP任务
这一章主要讲解一下FTP控件. 设计: 通过Demon库的Users表数据生成CSV文件. 生成后的CSV文件抛送到FTP指定目录下. 其他控件的使用这里就不做详细讲解了.大家如果有不懂得可以 ...
- awk二十问-【AWK学习之旅】
---===AWK学习之旅===--- 一行命令: 1.打印输入每行的字段总数: 最后一行的字段总数:END{print NF} 每行都显示字段总数: {print NF} 2.打印指定行: aw ...
随机推荐
- Javascript try catch finally
很少用到javascript的异常捕获,突然需要,发现挺全的,小小记录下,留爪. 直接打码: //public.js //异常输出 function exception(ex) { console.l ...
- java基础之Scanner类、 Random类
一.使用Scanner类,完成接收键盘录入数据 格式: Scanner sc = new Scanner(System.in) sc.nextInt(); 二.获取1-n之间的随机数 格式: Rand ...
- H5 ios端微信浏览器下-底部工具固定方法
在外层配置css position: fixed; width: 100%; top: 0px; bottom: 0px; overflow: auto; 结束
- 格林威治时间(Tue Jan 01 00:00:00 CST 2019)转Date
Excel导入时后台接受日期格式数据为[格林威治时间](例:Tue Jan 01 00:00:00 CST 2019) 格林威治时间转Date package com.cn; import java. ...
- eolinker响应预处理:传参解决方法(截取返回数据中的某一段数据,正则截取)
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景描述: 登录用例A,参加活动用例B,用户参加活动需要 ...
- 康谋方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案
一.自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案能够研究和验证高历程实验和恶劣驾驶环境下的AD系统的性能,支持云端和PC端操作,提供高保真度的仿真环境和传感器模型,实 ...
- .NET周刊【4月第1期 2025-04-06】
国内文章 35岁程序员的中年求职记:四次碰壁后的深度反思 https://www.cnblogs.com/minily/p/18803259 文章探讨程序员的35岁危机,指出这一问题确实存在,但也有其 ...
- 工良出品 | 长文讲解 MCP 和案例实战
作者:痴者工良 博客地址:https://www.whuanle.cn/ 示例项目地址:https://github.com/whuanle/mcpdemo 近期 MCP 协议越来越爆火,很多开发者都 ...
- Linux系统中的软件管理
简介 Linux 系统中的软件管理体系主要包括软件包管理工具.软件仓库以及相关的依赖管理等方面.以下是详细介绍: 软件包管理工具 dpkg:Debian 及其衍生系统(如 Ubuntu)使用的底层软件 ...
- DDD之EFCore实现值对象
参照: DDD之EFCore实现值对象 - peng_boke - 博客园 (cnblogs.com)