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 ...
随机推荐
- Ubuntu18.04编译Fuchsia
编译环境 系统:Ubuntu 18.04.1 LTS 64-bit 内存:8 GiB CPU:Intel Core i5-4200M CPU @ 2.50GHz × 4 1.安装编译环境 sudo a ...
- IdentityServer4 综合应用实战系列 (一)登录
这篇文章主要说登录,这里抛开IdentityServer4的各种模式,这里只说登录 我们要分别实现 4中登录方式来说明, IdentityServer4本地登陆 . Windows账户登录(本地的电 ...
- 关于 vim 的插件 snipmate 以及它的安装方式(使用国内源)
snipmate 是一个类似代码补全的东西,更好的地方在于自定义补全的内容. 最新的 snipmate 是在 https://github.com/garbas/vim-snipmate 而不是在官网 ...
- ch01系统基础信息模块详解
第1章 系统基础信息模块详解 1.1 系统性能信息模块 psutil 解决VMWare在Windows10的安装问题: 安装VC Redistributable 2017 解决虚拟机的上网问题:修改V ...
- less与sass的区别
在介绍less和sass的区别之前,我们先来了解一下他们的定义: 一.Less.Sass/Scss是什么? 1.Less: 是一种动态样式语言. 对CSS赋予了动态语言的特性,如变量.继承.运算.函数 ...
- 【Java】枚举类
文章目录 枚举类的使用 如何定义枚举类 方式一:jdk5.0之前,自定义枚举类 方式二:jdk5.0,可以使用enum关键字定义枚举类 Enum类的主要方法 toString() values() v ...
- Vulnhub - THE PLANETS: EARTH
环境配置 从www.vulnhub.com下载靶机,在VMware中导入,自动分配IP 主机发现 通过对内网主机的扫描,VMware为目标主机 端口扫描 使用nmap对主机进行扫描 发现443端口信息 ...
- 【分享】thanos receiver的grafana报表配置
具体的部署是:用prometheus抓取thanos receiver的10909端口,然后grafana再请求这个prometheus 具体的JSON配置请见最后 本文的一些监控配置,参考了这篇文章 ...
- 写react项目需要注意的
key应该是稳定的,且唯一的,尽量不要用索引作为key 都知道React组件渲染列表时需要为每个列表元素分配一个在列表中独一无二的key,key可以在DOM中的某些元素被增加或删除视乎帮助React识 ...
- electron-vue 项目添加启动loading动画问题
前言 electron-vue脚手架搭建的项目,在开发阶段可能你注意不到项目启动慢的问题,但是在build 生成的exe可执行文件,启动后,要反应很久才能进入到app.vue 中加载的页面,体验性很差 ...