Elasticsearch使用系列-.NET6对接Elasticsearch
Elasticsearch使用系列-ES增删查改基本操作+ik分词
Elasticsearch使用系列-基本查询和聚合查询+sql插件
Elasticsearch使用系列-.NET6对接Elasticsearch
先安装nuget包
Install Package NEST

1.创建索引
先建一个Model用于映射索引
/// <summary>
/// 商品信息
/// </summary>
public class OrderInfo
{
public string Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
public string GoodsName { get; set; } public string Status { get; set; }
}
1.1自动转换ES类型
/// <summary>
/// ES操作
/// </summary>
public class ESService
{
//创建连接client
private static ElasticClient _client = new ElasticClient(new Uri("http://192.168.101.13:9200")); //创建索引mapping
public void Mapping()
{
//创建索引,自动转换类型,order为索引名称
_client.Indices.Create("order", c => c
.Map<OrderInfo>(m => m
.AutoMap()
)); }
}
得到order的mapping的为
"order" : {
"mappings" : {
"properties" : {
"createTime" : {
"type" : "date"
},
"goodsName" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"status" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
1.2通过特性指定字段的ES类型
/// <summary>
/// 商品信息
/// </summary>
public class OrderInfo
{
[Keyword(Name="Id")]
public string Id { get; set; }
[Date(Name = "CreateTime")]
public DateTime CreateTime { get; set; }
[keyword]
public string Name { get; set; }
[Text]
public string GoodsName { get; set; } public string Status { get; set; }
}
通过给字段标特性指定字段转换成的ES类型,类型有:Text,Keyword,Number,Boolean,Date等
2.插入数据
2.1.插入单条数据
/// <summary>
/// 插入单条
/// </summary>
public void Insert()
{
var order = new OrderInfo()
{
Id = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Name = "张三",
GoodsName = "手机P50",
Status = "购物车"
};
var indexResponse = _client.Index(order, i => i.Index("order"));
if(!indexResponse.IsValid)
{
//插入失败处理
}
}
2.2批量插入数据
/// <summary>
/// 插入多条
/// </summary>
public void InsertList()
{
var orders = new List<OrderInfo>();
for(int i=1;i<=10;i++)
{
orders.Add(new OrderInfo()
{
Id = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Name = "王五" + i,
GoodsName="冰箱"+i,
Status="待付款"
});
} var bulkIndexResponse = _client.Bulk(b => b
.Index("order")
.IndexMany(orders));
if(!bulkIndexResponse.IsValid)
{
//失败处理
} }
3.数据查询
3.1查询全部数据
/// <summary>
/// 查询全部
/// </summary>
public void SearchAll()
{
QueryContainer query = new QueryContainer();
query = new MatchAllQuery(); //查询全部 var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q=>query)
);
//获取查询数据
List<OrderInfo> datas =searchResponse.Documents.ToList();
}
3.2分页查询
/// <summary>
/// 分页查询
/// </summary>
public void SearchPage()
{
QueryContainer query = new QueryContainer();
query = new MatchAllQuery(); //查询全部
int pageIndex = 1;
int pageSize = 5; var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q => query)
.From((pageIndex-1)*pageSize) //从第几条索引开始
.Size(pageSize) //返回多少条
);
//获取查询数据
List<OrderInfo> datas = searchResponse.Documents.ToList();
}
3.3游标查询Scroll
为了避免深度分页性能问题,ES默认From&Size的查询只能查询到10000条之前的数据,要查询10000条之后的数据,需要用到游标查询
第一次查询产生scrollId,后面的查询只需要scrollId就可以记住原来的条件和查询位置,往后滚动查询
/// <summary>
/// 游标查询
/// </summary>
public void SearchScroll()
{
MatchAllQuery query = new MatchAllQuery();//查询全部
int pageSize = 5; var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q => query)
.Size(pageSize) //一次返回多少条
.Scroll("10s") //scrollId有效时间
);
//获取查询数据
List<OrderInfo> datas = searchResponse.Documents.ToList(); string scrollId = searchResponse.ScrollId;//游标Id
//后面的查询只需要用scrollId查询
var searchResponse2 = _client.Scroll<OrderInfo>("10s", scrollId); List<OrderInfo> datas2 = searchResponse2.Documents.ToList(); }
3.4条件查询
/// <summary>
/// 条件查询
/// </summary>
public void SearchWhere()
{
//查询name=王五
var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q => q.Term(q=>q.Name, "王五1"))
);
//获取查询数据
List<OrderInfo> datas = searchResponse.Documents.ToList();
}

3.5条件or查询
/// <summary>
/// 条件or查询
/// </summary>
public void SearchOr()
{
//查询 name='王五1'or name='王五二'
var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q => q
.Term(o=>o.Name,"王五1")||q
.Term(o=>o.Name,"王五2"))
);
//获取查询数据
List<OrderInfo> datas = searchResponse.Documents.ToList();
}

3.6条件And查询
/// <summary>
/// 条件and查询
/// </summary>
public void SearchAnd()
{
//查询 name='王五1'or status='待付款'
var searchResponse = _client.Search<OrderInfo>(s => s
.Index("order")
.Query(q => q
.Term(o => o.Name, "王五1") && q
.Term("status.keyword", "待付款")) //因为status是text+keyword类型,查询字段要加上".keyword"
);
//获取查询数据
List<OrderInfo> datas = searchResponse.Documents.ToList();
}
3.7聚合统计查询
/// <summary>
/// 聚合查询统计
/// </summary>
public void SearchAggs()
{
//求员工年龄平均值和最大年龄
var searchResponse = _client.Search<object>(s => s
.Index("employee")
.Size(0) //不返回源数据
.Aggregations(aggs=>aggs
.Average("avgage",avg=>avg.Field("age"))
.Max("maxage",max=>max.Field("age"))
));
var datas = searchResponse.Aggregations ; }

3.8聚合分组查询
/// <summary>
/// 聚合分组查询
/// </summary>
public void SearchAggsGroup()
{
//求员工年龄平均值和最大年龄
var searchResponse = _client.Search<object>(s => s
.Index("employee")
.Size(0) //不返回源数据
.Aggregations(aggs => aggs
.Terms("jobgroup", group => group.Field("job"))
));
var datas = searchResponse.Aggregations; }

4.sql语句查询
需要安装sql插件,参照前一篇文章,这里通过rest api向ES发起sql语句的查询
建一个参数类和HttpHelper
public class QueryParam
{
public string query { get; set; }
}
public class HttpHelper
{
private static HttpClient _httpClient = new HttpClient();
public static string Post(QueryParam param, string url)
{
HttpContent content = new StringContent(JsonConvert.SerializeObject(param));
content.Headers.ContentType= new MediaTypeHeaderValue("application/json");
string result = _httpClient.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;
content.Dispose();
return result;
}
}
向ES发起sql语句查询
/// <summary>
/// sql语句查询
/// </summary>
public void SearchSql()
{
QueryParam queryParam = new QueryParam();
queryParam.query = "select * from employee where job='java'";
string url = "http://192.168.101.13:9200/_xpack/sql?format=csv";
var result = HttpHelper.Post(queryParam, url);
Console.WriteLine(result);
}

这里查询返回的格式为csv格式,数据需要自己解析成对象
更多用法参考NEST官网:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/index.html
Elasticsearch使用系列-.NET6对接Elasticsearch的更多相关文章
- Elasticsearch使用系列-Docker搭建Elasticsearch集群
Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...
- 十四、.net core(.NET 6)搭建ElasticSearch(ES)系列之给ElasticSearch添加SQL插件和浏览器插件
给ES添加SQL插件的方法: 下载SQL插件地址:https://github.com/NLPchina/elasticsearch-sql 当前最新的是7.12版本,我的ES是7.13版本,暂且将 ...
- Elasticsearch使用系列-基本查询和聚合查询+sql插件
Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...
- 剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存 ...
- django使用haystack对接Elasticsearch实现商品搜索
# 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
- ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程
前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...
- ElasticSearch实战系列四: ElasticSearch理论知识介绍
前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...
- ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合
Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...
随机推荐
- Microsoft HoloLens 开发(3): 全息图交互方式 - Gaze
Gaze(凝视) 是 HoloLens 交互输入的第一种形式,告诉你 用户 在世界上的位置,并让你确定他们的意图. 1.Gaze的用途 作为一个 Mixed Reality 开发者,Gaze 可以做很 ...
- idea 创建Maven项目,Enable auto Import报“本地服务器没有从权威服务器上收到响应”
完整的报错信息:Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to cent ...
- MongoDB学习 - 安装部署
1. docker 启动 拉取镜像 docker pull mongo:latest 指定目录启动 docker run -d -p 27017:27017 --name mongo \-v /ho ...
- BIO、NIO、AIO --- 个人理解
1.前言 什么是 BIO.NIO.AIO ,不难看出,都是共同的字符IO , IO的意思是input output ,即输入输出 , 那么 B . N .A 分别指不同的io模型 ,而io又分为 ...
- sql审核-避免离线sql导致的db集群故障
关键词: sql审核.sql审批.sql检查.sql检测.sql执行 离线sql可能会导致的问题 首先,什么是离线sql呢?就是说手动触发执行的这种sql:相对的还有在线sql,位于我们的程序代码中, ...
- Java实现抽奖模块的相关分享
Java实现抽奖模块的相关分享 最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下. 一.DAO层 /** * 获取奖品列表 * @param systemVersion 手机系统版本( ...
- markdown mermaid状态图
状态图 状态图是一种用于计算机科学和相关领域描述系统行为的图.状态图要求描述的系统由有限数量的状态组成. 语法: stateDiagram-v2 [*] --> Still Still --&g ...
- prtotype原型对象
js每个对象都拥有一个原型对象,每个对象都能从原型对象继承方法和属性,原型链就是基于原型对象而产生的, 也就是说,每个对象都能继承原型对象的方法和属性,这样一层一层的继承,就形成了原型链 当然,你也可 ...
- 《剑指offer》面试题32 - III. 从上到下打印二叉树 III
问题描述 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20, ...
- 小程序onShareAppMessage有点迷
小程序遇到的问题 起因 目前项目需求是分享时携带参数去进行裂变,但是在查看微信文档后发现有onShareAppMessage这个页面处理事件可以使用.事件可以使用return一个Object,用于自定 ...