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 ...
随机推荐
- 话说Hangfire
参考文档 www.hangfire.io github.com/HangfireIO/Hangfire .NET Core开源组件:后台任务利器之Hangfire
- 经过几天的努力Biwen.AutoClassGen终于实现了DTO复杂属性的生成
前言 距写上一篇 https://www.cnblogs.com/vipwan/p/18535459 生成DTO已经有一段时间了, 最初没有考虑复杂二级属性嵌套的实现,而是直接使用排除使用自定义的方式 ...
- lua随写
--local util={}--function util.Split(str, sep)-- local sep, fields = sep or ":", {}-- loca ...
- zk源码—6.Leader选举的实现原理
大纲 1.zk是如何实现数据一致性的 (1)数据一致性分析 (2)实现数据一致性的广播模式 (3)实现数据一致性的恢复模式 2.zk是如何进行Leader选举的 (1)服务器启动时的Leader选举 ...
- @Autowired原理
例子. // <bean id="> id默认类名首字母小写 默认是单例 // @Scope(value = "prototype") @Repository ...
- Asp.net mvc基础(六)TempData
在客户端重定向或验证码等情况下,由于要跨请求的存取数据,是不能放到ViewBag.Model中,需要"暂时存到Session中,用完了删除"的需求:使用TempData可以做到. ...
- 关于:js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1
今天使用js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1,一直找不到原 ...
- 【记录】Docker|Ubuntu Docker 修改dockerfile换源、主机共享网络解决apt update 失败
本文测试环境:虚拟机 Ubuntu20.04 Docker20 1 修改dockerfile dockerfile第二行后面加如下内容,一键换源: RUN sed -i s:/archive.ubun ...
- CLion打开VS创建的GBK编码格式的项目中文乱码问题的解决方法
在 CLion 中设置 GBK 编码用于编译代码时,如果输出的 message 乱码,通常是由于控制台编码与代码文件的编码不匹配导致的.以下是解决问题的步骤: 1. 设置文件编码为 GBK 确保你的源 ...
- dom操作补充
s5.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...