.Net Core中使用ElasticSearch(二)
.Net的ElasticSearch 有两个版本,Elasticsearch.Net(低级) 和 NEST(高级),推荐使用 NEST,低级版本的更灵活,水太深 把握不住。有个需要注意,使用的版本号必须要ElasticSearch服务端版本号一致。
一、 连接池
1.1 SingleNodeConnectionPool 单节点连接池
适合只有一个节点的情况。当没有在ConnectionSettings 构造函数中显式指定连接池类型的时候,默认此连接池。这种连接池不会标记节点是否存活
1.2 StaticConnectionPool 静态连接池
适合多个节点,它维护一个静态的节点hosts清单,使用前通过ping节点来确认节点是否存活。如果一个节点处理请求失败,该节点会被标记为死节点,这个节点会被“关禁闭”,“关禁闭”出来后,会再次处理请求,如果还是失败,“关禁闭”的时间会更长。
1.3 SniffingConnectionPool 嗅探连接池
它继承至静态连接池,有静态连接池的Ping特性。区别在于是动态的,用户提供hosts种子,而客户端则会嗅探这些hosts并发现集群的其他节点。当集群中添加或删除节点时,客户端会相应更新。
1.4 StickyConnectionPool 黏性连接池
选择一个可用节点作为请求主节点,支持ping 不支持嗅探
1.5 StickySniffingConnectionPool 黏性嗅探连接池
选择一个可用节点作为请求主节点,支持ping 支持嗅探
二、注入
官方推荐使用单例注入ElasticClient。
services.AddSingleton<IElasticClient>(provider =>
{
var connectionPool = new SingleNodeConnectionPool(new Uri("http://127.0.0.1:9200"));
var connectionSetting = new ConnectionSettings(connectionPool).DisableDirectStreaming();
return new ElasticClient(connectionSetting);
});
三、增删改查
3.1 添加
3.1.1 单个添加
var user = new User()
{
Id = 1,
Age = 18,
Name = "MicroHeart",
Gender = true
};
//第一种
var resp = client.Index(user, s => s.Index(indexName));//指定操作索引名称
//第二种
connectionSettings.DefaultIndex(indexName);//指定默认索引名称
var client = new ElasticClient(connectionSettings);
resp = client.IndexDocument(user);//操作默认索引
3.1.2 批量添加
//第一种
var resp = client.IndexMany(new List<User>() { user }); //操作默认索引
resp = client.IndexMany(new List<User>() { user }, indexName); //操作指定索引
//第二种
resp = client.Bulk(b => b.Index(indexName).IndexMany(users, (desc, user) => desc.Index(user.Gender ? "boy" : "girl")));
//第三种
var bulkAllObservable = client.BulkAll(users, b => b
.Index("people")
.BackOffTime("30s") //重试间隔时间
.BackOffRetries(2) //重试次数
.RefreshOnCompleted()
.MaxDegreeOfParallelism(Environment.ProcessorCount)
.Size(1000) //每次请求文档个数
);
IndexMany:是在单个 HTTP 请求所有文档,因此对于非常大的文档集合,这不是建议的方法。
Bulk:是在单个 HTTP 请求所有文档,如果需要对很多文档进行索引控制,可以使用此方法。例子中将男孩插入“boy”索引中,女孩添加到“girl”索引中
BulkAll:适合对多个大文档集合操作,在多个HTTP请求中,分批次操作文档,内置了重试机制。
上面所有的插入方法都是根据_id的值判断文档是否存在(这里因为user有个属性为Id,默认Es将Id的属性值作为_id的值),如果已经存在文档,就更新,否则就添加。
通过返回对象的IsValid属性来判断是否添加成功。
3.2 删除
var resp = client.Delete<User>(1, d => d.Index(indexName));//单个删除
var resp = client.DeleteByQuery<User>(x => x.Index(indexName).Query(q => q.Range(r => r.Field(f => f.Age).LessThan(18)))); //删除年龄小于18的
返回的对象包含
deleted:表示删除的数量。
Failures:删除失败的集合。
3.3 查询
3.3.1 根据Id获取单个
var resp = client.Get<User>(3, d => d.Index(indexName));
返回的类型为 GetResponse<User>,包含下面几个属性。
index:表示索引,
type:值固定为“_doc”,
found:表示是否找到文档,
version:文档的版本号,
source:存储的数据user
3.3.2 根据Id集合获取多个
var resp = client.GetMany<User>(new List<long>() { 19L, 20L, 21L }, indexName);
3.3.3 根据条件查询
var resp = client.Search<User>(x => x.Index(indexName)
.From(0)
.Size(20)
.Query(q => q.Range(r => r.Field(f => f.Age).GreaterThan(18)) &&
q.Range(r => r.Field(f => f.Age).LessThan(30)) &&
q.Term(t => t.Gender, true)));
返回的类型为 ISearchResponse<User>,包含下面几个属性。
TimedOut:查询是否超时
Shards:完成这个搜索查询了多少个分片
Took:此次查询消耗的时间
MaxScore:此次查询中最符合查询条件的文档的最大得分
Total:符合查询条件的总数
Hits:存储的数据user集合
例子只是简单的查询。ES专为查询而生,所以它的查询很灵活,后面单独讲。
3.4 更新
var user = new User()
{
Age = 18,
Gender = false,
Name = "test"
};
var resp4 = client.Update<User>(20, u => u.Index(indexName).Doc(user));
返回的IsValid 表示是否更新成功。
封装装一个操作仓储,链接
.Net Core中使用ElasticSearch(二)的更多相关文章
- .Net Core中使用ElasticSearch(一)
一.安装配置 在官网下载Es,注意版本号,不同大版本号之间差异很大.我安装的是7.14.0版本 1.1 安装成服务 cmd 进入bin目录下执行 elasticsearch-service.bat i ...
- (12)ASP.NET Core 中的配置二(Configuration)
1.内存配置 MemoryConfigurationProvider使用内存中集合作为配置键值对.若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemory ...
- IdentityServer4在Asp.Net Core中的应用(二)
继续上次授权的内容,客户端模式后我们再说以下密码模式,先回顾下密码模式的流程: 我们还是使用上次的代码,在那基础上修改,在IdentityServer4里面有一个IdentityServer4.Tes ...
- (13)ASP.NET Core 中的选项模式(Options)
1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(二)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- ELK系列(二):.net core中使用ELK
ELK安装好后,我们现在.net Core中使用一下,大体思路就是结合NLog日志组件将数据写入ELK中,其它语言同理. ELK的安装还是有些复杂的,我们也可以在Docker中安装ELK:docker ...
- 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...
随机推荐
- appium操作安卓应用所需要的数据准备
操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...
- OGG-如何只同步最近某个时间范围的数据
一.需求,某客户希望使用OGG只同步时间大于2021-02-01日期之后的数据变换 需求如标题所示,如何使用OGG进行配置? 客户环境需要同步的表有几百G,表数据太大了;如果同步所有数据,目标库空间存 ...
- VMware Tanzu社区版初体验
VMware Tanzu社区版 VMware Tanzu Community Edition 是一个功能齐全.易于管理的 Kubernetes 平台,供学习者和用户使用. 它是一个免费的.社区支持的. ...
- 命名空间、作用域、LEGB法则、垃圾回收机制
一.命名空间.作用域.LEGB法则. 1.命名空间和作用域 : 命名空间:变量名称与值的映射关系 作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分支语句,循环语句,异常 ...
- Redis使用过程中有哪些注意事项?看看BAT这类的公司是正确使用Redis的!!
Redis使用过程中要注意的事项 Redis使用起来很简单,但是在实际应用过程中,一定会碰到一些比较麻烦的问题,常见的问题有 redis和数据库数据的一致性 缓存雪崩 缓存穿透 热点数据发现 下面逐一 ...
- 使用寄存器点亮LED
1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 代码: 只需要编写main.c程序,stm3210x.h程序为空(只需要新建即可). 2.1 点亮绿灯main.c程序 ...
- F1英国大奖赛-银石赛道地图及弯道
背景 今天晚上(2020-08-02)是今年英国大奖赛的正赛.刚好了解了一下赛道地图.记录一下,明年就不用到处找了. 简介 银石赛道(Silverstone Circuit)由一个废弃的空军基地改建, ...
- 【UE4 材质】一些小功能
利用材质实现物体自转 物体外轮廓高亮 使用postprocess+custom depth(防遮挡) https://www.tomlooman.com/soft-outlines-in-ue4/ h ...
- SpringCloud微服务实战——搭建企业级开发框架(八):使用注解校验微服务消息参数
平时开发过程中,经常要用到参数校验,如果直接在代码逻辑里面写参数校验,代码有点冗余且用起来不是非常方便,显得代码逻辑复杂且重复代码太多,这里我们使用注解的方式进行参数校验,SpringBoot中常 ...
- Vue | uni-app 中使用websocket
@ 目录 首先在根目录下新建一个store文件夹,并新建一个websocket.js文件,代码如下: import Vue from 'vue' import Vuex from 'vuex' Vue ...