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 ...
随机推荐
- [学习笔记] IT项目管理 - 关键路径法
关键路径法 只有项目网络中最常的或者耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径.组成关键路径的活动称为关键活动. 图形表示 最早开始时间ES 工期Duration 最早结束时 ...
- Linux_接收文件(rz)和发送文件(sz)
我们连接linux通常是使用一些ssh工具进行远程访问连接的,在使用过程中,少不了将本地文件上传到linux或将linux上的文件下载到本地,每次使用ftp比较繁琐而且浪费时间.我们可以使用linux ...
- JMeter_jmeter-plugins插件的安装使用
一.安装JMter Plugins 1.官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter ...
- [ Flask ] myblog_flask问题集(RESTfull风格)
VUE问题 前端VUE怎么捕获所有404NOT FOUND的路由呢? [ 解决方案 ] vue-router路由守卫,参考文档:动态路由匹配 对于路由.../edit/<id>,自己能编辑 ...
- window10 查看端口列表 - 查看占用的进程-销毁该进程
cmd进入指令框后 查看端口列表 netstat -ano 查看占用的进程 [6666是端口号对应的进程数] tasklist|findstr "6666" 销毁该进程 [6666 ...
- 历时5月,Kubernetes1.19正式发布 !Ingress迎来GA,存储容量跟踪新特性
我们迎来了Kubernetes1.19,这是2020年发布的第二个版本,也是迄今为止最长的发布周期,总共持续了20周.它包括33个增强功能:12个增强功能达到稳定版,18个增强处在beta版,还有13 ...
- k8s中的nginx-ingress如何配置路径重定向
k8s中的nginx-ingress如何配置路径重定向 一. 需求描述 路径重定向的一般应用场景: 调整用户浏览的URL,看起来更规范 为了让搜索引擎收录网站内容,让用户体验更好 网站更换新域名后 根 ...
- 还在用visio?这款画图工具才是真的绝!
最近有读者私信我,问我推文的配图是用什么工具画的,很好看,也想学习一下.今天就给大家介绍一下这款画图工具--Draw.io 概述 draw.io是一款免费的网页版画图工具(也有桌面版),支持流程图.U ...
- Java 集合详解 | 一篇文章解决Java 三大集合
更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...
- [Android测试] Appium的一些坑问题错误解决 与 技巧集锦
转:https://blog.csdn.net/niubitianping/article/details/52624417 1. error: Failed to start an Appium s ...