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 ...
随机推荐
- PHP-FPM 开启慢日志记录
首先,找到 php-fpm 所在的目录: 使用 which php-fpm 使用 whereis php-fpm 然后找到 php-fpm.conf 所在的目录: 使用 ps -ef | grep p ...
- MySQL索引失效的常见场景
当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...
- 记一次线上SpringCloud-Feign请求服务超时异常排查
由于近期线上单量暴涨,第三方反馈部分工单业务存在查询处理失败现象,经排查是当前系统通过FeignClient调用下游系统出现部分超时失败(异常代码贴在下方). Caused by: feign.Ret ...
- Kotlin 协程一 —— 全面了解 Kotlin 协程
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
- 微服务架构 | 3.1 Netflix Eureka 注册中心
目录 前言 1. Eureka 基础知识 1.1 Eureka 模型中的服务器与客户端 1.2 Eureka 的 30s 启动机制 1.3 Eureka 为什么注册服务的 IP ,而不是主机名 1.4 ...
- 《剑指offer》面试题48. 最长不含重复字符的子字符串
问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- manjora20安装搜狗输入法
先安装好fcitx和yay yay -S fcitx-sogoupinyin sudo pacman -S base-devel 这是因为需要使用外网,需要配置代理. 注意 manjora20输入法一 ...
- springMvc 启动过程
转载自https://www.jianshu.com/p/dc64d02e49ac 这里给出一个简洁的文字描述版SpringMVC启动过程: tomcat web容器启动时会去读取web.xml这样的 ...
- MobaXterm中文乱码问题
现在Xshell和SecureCRT都要收费,本着不用盗版的原则,同时需要标签管理session,快捷命令等功能,最后选择了MobaXterm. 但是使用后发现中文会乱码.后按照博客的方法,修改了终端 ...
- Rust 使用 dotenv 来设置环境变量
在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用 dotenv 这个 crate. 首先在项目中添加 dotenv 这个依赖: 例如在下面这个项目中,需要设置数据库 ...