Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >扩展Elasticsearch客户端简化ES查询(.net core/framework)

扩展Elasticsearch客户端简化ES查询(.net core/framework)

原创
作者头像
用户8604107
修改于 2021-07-07 06:28:38
修改于 2021-07-07 06:28:38
1.7K0
举报
文章被收录于专栏:crl .netcrl .net

### 扩展Elasticsearch客户端简化ES查询(.net core/framework)

Elasticsearch .net 客户端提供了两种方式进行查询操作

基于对象构造查询

```csharp

new IdsQuery

{

Name = "named_query",

Boost = 1.1,

Values = new List<Id> { 1, 2, 3, 4 },

}

```

基于lambda语法查询

```csharp

q

.Ids(c => c

.Name("named_query")

.Boost(1.1)

.Values(1, 2, 3, 4)

)

```

两种方式各有优缺点,最主要原因是条件稍有点复杂后,感觉像在套娃,一层套一层,特别是lambda

如:

```csharp

var searchResults = this.Client.Search<Project>(s => s

.Query(q => q

.Bool(b => b

.Should(

bs => bs.Term(p => p.Name, "x"),

bs => bs.Term(p => p.Name, "y")

)

)

)

);

```

官方文档有简化的写法,[Writing bool queries | Elasticsearch.Net and NEST: the .NET clients [7.x\] | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/net-api/7.x/bool-queries.html)

但是这种方法式的调用还是很麻烦,避免不了方法组合

对于一般逻辑查询,通过运算符(d,!=,>,<)处理会更简洁

以下示例ES版本为7.x

1. 安装nuget包:CRL.Elasticsearch

2. using CRL;

using CRL.Elasticsearch;

**定义数据源**

```c#

var builder = DBConfigRegister.GetInstance();

builder.UseElasticsearch();

builder.RegisterDBAccessBuild(dbLocation =>

{

var dBAccessBuild= new DBAccessBuild(DBType.ES, "http://127.0.0.1:9200/testIndex");

//定义连接设置

Func<ConnectionSettings, ConnectionSettings> func = (setting) =>

{

setting.DefaultMappingFor<GoodsInfo>(m => m.IndexName("testIndex"));

setting.DefaultMappingFor<GoodsInfoChild>(m => m.IndexName("testIndex"));

return setting;

};

dBAccessBuild.Data = func;

return dBAccessBuild;

});

```

**定义查询对象**

```c#

public class GoodsService:BaseProvider<GoodsInfo>

{

}

```

**初始数据**

```c#

public static void CreateMapping()

{

var service = new GoodsService();

service.DropTable();

service.CreateEsIndex();

var list = new List<GoodsInfo>();

for (int i = 1; i < 11; i++)

{

list.Add(new GoodsInfo { Id = i.ToString(), DataType = "Goods", Name = "goods" + i, Number = i });

}

service.BatchInsert(list);

var service2 = new GoodsInfoChildService();

var childs = new List<GoodsInfoChild>();

childs.Add(new GoodsInfoChild("1", "100", "History") { GroupCode = "001" });

childs.Add(new GoodsInfoChild("1", "200", "History") { GroupCode = "001" });

service2.BatchInsert(childs);

}

```

**按逻辑查询**

```c#

var service = new GoodsService();

var list = service.QueryList(b => b.DataType == "Goods" && b.Id != "2");

Console.WriteLine($"count should 9 {list.Count == 9}");

```

**对结果进行分组**

```c#

public static void testAggregationCount()

{

var service = new GoodsService();

var query = service.GetLambdaQuery();

query.Where(b => b.DataType == "Goods");

query.GroupBy(b => new { b.DataType, b.Name });

var list = query.ToAggregationCount();

Console.WriteLine($"count should 2 {list.Count == 2}");

}

```

**指定查询方法**

```c#

public static void testMethodAll()

{

var service = new GoodsService();

var query = service.GetLambdaQuery();

var ids = new List<Id>();

ids.Add("1");

query.Where(b => b.WithIdsQuery(ids));

query.Where(b => b.Name.WithWildcardQuery("goods*"));

query.Where(b => b.Name.WithTermQuery("goods"));

query.Where(b => b.Name.WithMatchQuery("goods", Operator.And));

query.Where(b => b.Name.WithMatchPhraseQuery("goods"));

query.Where(b => b.WithMultiMatchQuery(new string[] { "Name", "DataType" }, "goods", Operator.And, TextQueryType.BestFields));

query.Where(b => b.WithQueryBase(new WildcardQuery

{

Field = "Name",

Value = "goods"

}));

}

```

**子查询判断**

```c#

public static void testChildQuery()

{

var service = new GoodsService();

var query = service.GetLambdaQuery().Where(b => b.DataType == "Goods");

var queryChild = query.CreateQuery<GoodsInfoChild>();

queryChild.Where(b => b.GroupCode == "001");

query.HasChild(queryChild);

var list = query.ToList();

Console.WriteLine($"count should 1 {list.Count == 1}");

}

```

源码示例参考

[Data/esTest · hubroxxl/CRL - 码云 - 开源中国 (gitee.com)](https://gitee.com/hubroxxl/crl/tree/master/Data/esTest)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET Core中使用NEST简单操作Elasticsearch
C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net,NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作,而Elasticsearch.Net相比之下更为原始直接非常自由。
郑子铭
2023/08/29
7800
.NET Core中使用NEST简单操作Elasticsearch
.NET Core下ES查询驱动PlainElastic
由于历史原因,笔者所在的公司原有的ES查询驱动采用的是 PlainElastic.Net, 经过询问原来是之前PlainElastic.Net在园子里文档较多,上手比较容易,所以最初作者选用了该驱动,而发布也由于历史原因都部署在 windows 服务器上,基于 .NET Framework开发。
郑子铭
2022/03/22
5710
.NET Core下ES查询驱动PlainElastic
扩展ADO.net实现对象化CRUD(.net core/framework)
通过扩展方法**GetLambdaQuery<T>**获取ILambdaQuery对象
用户8604107
2021/06/30
4100
对EF Core进行扩展使支持批量操作/复杂查询
EF Core的问题一言难尽,然后有了各种插件,批量插入扩展,批量更新扩展,查询扩展。。。然后一个项目引入一堆扩展
用户8604107
2021/07/06
1.5K0
ES客户端索引相关操作
在 response 包下,新建两个类,分别是 ResultCode(interface), ResponseResult.java:
程序员 NEO
2023/09/27
3610
ES客户端索引相关操作
ElasticSearch客户端调用
在elasticsearch官网中提供了各种语言的客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html
兜兜转转
2023/03/29
3.4K0
ElasticSearch客户端调用
union 分页/group/join 复杂查询(.net core/framework)
### union 分页/group/join 复杂查询(.net core/framework)
用户8604107
2021/07/08
7020
SpringBoot整合elasticsearch
在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows可以自定百度一下。 下面是官方套话介绍elasticsearch: ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业
dalaoyang
2018/06/13
8520
.NET Core接入ElasticSearch 7.5
最近一段时间,团队在升级ElasticSearch(以下简称ES),从ES 2.2升级到ES 7.5。也是这段时间,我从零开始,逐步的了解了ES,中间也踩了不少坑,所以特地梳理和总结一下相关的技术点。
AI.NET 极客圈
2020/05/18
1.5K0
dotNet Core 3.1 使用 Elasticsearch
Elasticsearch 是基于 Lucene 的搜索引擎。可以非常方便地实现分布式的全文搜索,本文介绍在 dotNet Core 3.1 中怎样使用 Elasticsearch 。
oec2003
2021/02/19
8140
dotNet Core 3.1 使用 Elasticsearch
海量数据即时查询引擎ElasticSearch入门 附.Net Core例子
Elasticsearch是基于Lucene的搜索引擎。它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档。 Elasticsearch是用Java开发的,根据Apache许可条款作为开源发布。
码农阿宇
2018/09/06
1.6K0
海量数据即时查询引擎ElasticSearch入门 附.Net Core例子
万字详解!在 Go 语言中操作 ElasticSearch
在大数据和搜索引擎技术不断进步的今天,ElasticSearch 已成为业界内非常流行的搜索引擎解决方案,被广泛应用于日志分析、全文搜索、数据分析等领域。针对 Go 语言开发者来说,olivere/elastic 是一个非常强大而且易于使用的 ElasticSearch 客户端库,允许开发者在 Go 应用中轻松地操作 ElasticSearch。
南山竹
2024/07/05
4070
万字详解!在 Go 语言中操作 ElasticSearch
ElasticSearch高级操作
term查询,查询text类型字段时,只有其中的单词相匹配都会查到,text字段会对数据进行分词
小炜同学
2022/09/23
7740
来聊一聊 ElasticSearch 最新版的 Java 客户端
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。
江南一点雨
2023/01/04
2.6K0
来聊一聊 ElasticSearch 最新版的 Java 客户端
Elasticsearch 索引容量管理实践
Elasticsearch是目前大数据领域最热门的技术栈之一,腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可伸缩的云端全托管 Elasticsearch 服务,完善的高可用解决方案,让业务可以放心的把重要数据存储到腾讯云 ES 中。
腾讯云大数据
2021/01/07
9960
Elasticsearch 索引容量管理实践
01_ElasticSearch学习笔记
如何能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术。 常见的全文检索技术有 Lucene、solr 、elasticsearch 等。
全栈程序员站长
2022/06/30
1.4K0
01_ElasticSearch学习笔记
.NET也能玩大数据(ClickHouse与ElasticSearch)
当别人做大数据用Java、Python的时候,我使用.NET做大数据、数据挖掘,这确实是值得一说的事。写的并不全面,但都是实际工作中的内容。
郑子铭
2023/10/25
3720
.NET也能玩大数据(ClickHouse与ElasticSearch)
Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
注意:tring/nested/array 类型字段不能用作排序字段。因此 string 类型会升级为:text 和 keyword。keyword 可以排序,text 默认分词,不可以排序。
二哥聊运营工具
2021/12/17
4.1K0
Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
Elasticsearch 索引容量管理实践
Elasticsearch是目前大数据领域最热门的技术栈之一,腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可伸缩的云端全托管 Elasticsearch 服务,完善的高可用解决方案,让业务可以放心的把重要数据存储到腾讯云 ES 中。
姚俊刚
2020/06/18
3.3K0
Elasticsearch 索引容量管理实践
Elasticsearch 索引容量管理实践
作者:gavinyao,腾讯 PCG 后台开发工程师 Elasticsearch 是目前大数据领域最热门的技术栈之一,腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可伸缩的云端全托管 Elasticsearch 服务,完善的高可用解决方案,让业务可以放心的把重要数据存储到腾讯云 ES 中。 了解 ES 的索引管理方法有助于扬长避短,更好的利用 ES 的强大功能,特别是当遇到性能问题时,原因通常都可回溯至数据的索引方式以及集群中的
腾讯技术工程官方号
2020/07/06
1.2K0
相关推荐
.NET Core中使用NEST简单操作Elasticsearch
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档