ElasticSearch.net NEST批量创建修改删除索引完整示例
本示例采用Elasticsearch+Nest
网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例。比如新增或修改索引,都是发起一个request新增或修改一条数据,当一次性修改几千条数据时,发起的requst请求过多容易导致429 Too Many Request的错误,单个新增修改索引就非常不适用。其实Nest有批量新增、修改索引的功能,批量删除也可以。现将项目中采用Elasticsearch的C#代码分享如下:
使用NEST客户端
1.连接
- public ElasticClient GetElasticClient(string esServer, string IndexName)
- {
- ElasticClient client = null;
- string[] server = esServer.Split(',');
- Uri[] nodes = new Uri[server.Length];
- for (int i = 0; i < server.Length;i++ )
- {
- nodes[i] = new Uri(server[i]);
- }
- var connectionPool = new StaticConnectionPool(nodes);
- var settings = new ConnectionSettings(
- connectionPool
- );
- settings.DefaultIndex(IndexName);
- client = new ElasticClient(settings);
- return client;
- }
2.添加索引
- var indexExist = client.IndexExists(IndexName);
- if (!indexExist.Exists)
- {
- //基本配置
- IIndexState indexState = new IndexState()
- {
- Settings = new IndexSettings()
- {
- NumberOfReplicas = 1,//副本数
- NumberOfShards = 6//分片数
- }
- };
- //ICreateIndexResponse response = client.CreateIndex(IndexName, p => p.Mappings(m => m.Map<ES_PUB_Stock>(mp => mp.AutoMap())));
- ICreateIndexResponse response = client.CreateIndex(IndexName, p => p
- .InitializeUsing(indexState)
- .Mappings(ms =>
- ms.Map<ES_PUB_Stock>(m =>
- m.AutoMap()
- .Properties(ps =>
- ps.Nested<ES_PUB_StockPrice>(n =>
- n.Name(c => c.stockPrice)
- )
- .Nested<ES_PUB_SpecValue>(q=>
- q.Name(c=>c.specValue))))));
- if (response.IsValid)
- {
- string msg = string.Format("索引创建" + IncrementIndexName + "成功!");
- this.WriteLog(msg);
- }
- else
- {
- string msg = string.Format("索引创建" + IncrementIndexName + "失败!");
- this.WriteLog(msg);
- Thread.CurrentThread.Abort();
- }
- }
这里创建索引设置6个分片数,并Mapping自定义的结构。
Mapping相关类型如下:
- <span style="font-size:14px;">using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Nest;
- namespace SearchMaker.Model.ES.PUB
- {
- [ElasticsearchType(IdProperty = "sid", Name = "ES_PUB_Stock")]
- public class ES_PUB_Stock
- {
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public long? sid { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string model { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string brand { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string encapsulation { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string batchNo { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int invQty { get; set; }
- [Date(Format = "yyyy-MM-dd HH:mm:ss")]
- public string updateTime { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int upByMemberID { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string upByMemberName { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string guid { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public decimal? price { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int? leastQty { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int limitTime { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string proImg { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string categoryNO { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string proRemark { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int type { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int sendToday { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int pickedToday { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string categoryName { get; set; }
- [Object(Path = "specValue")]
- public List<ES_PUB_SpecValue> specValue { get; set; }
- [Object(Path = "stockPrice")]
- public List<ES_PUB_StockPrice> stockPrice { get; set; }
- [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
- public string specsName { get; set; }
- [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
- public string keyword { get; set; }
- [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
- public string modelAS { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int modelLength { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public decimal score { get; set; }
- }
- [ElasticsearchType(Name = "ES_PUB_StockPrice")]
- public class ES_PUB_StockPrice
- {
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public int? minval { get; set; }
- [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
- public decimal? price { get; set; }
- }
- [ElasticsearchType(Name = "ES_PUB_Specs")]
- public class ES_PUB_SpecValue
- {
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string spec { get; set; }
- [String(Index = FieldIndexOption.NotAnalyzed)]
- public string value { get; set; }
- }
- }
- </span>
这里中文分词采用IK分词
3.单个新增、修改索引
- <span style="font-size:14px;"> private int CreateIndex(ES_PUB_Stock param)
- {
- int indexCnt = 0;
- if (param.sid.GetValueOrDefault(0) > 0)
- {
- var response = client.Index<ES_PUB_Stock>(param, i => i.Index(IndexName).Type(IndexType));
- if (response.IsValid)
- {
- indexCnt++;
- }
- else
- {
- this.WriteWarmessage("创建" + IncrementIndexName + "索引,发生异常:SID:" + param.sid.ToString() + "," + response.DebugInformation, "");
- }
- }
- return indexCnt;
- }</span>
4.批量新增、修改索引
- <span style="font-size:14px;"><span style="white-space:pre"> </span>BulkDescriptor descriptor = new BulkDescriptor();</span><pre name="code" class="csharp"><span style="font-size:14px;"><span style="white-space:pre"> </span>descriptor.Index<ES_PUB_Stock>(op => op.Document(esStock));</span></pre><pre name="code" class="csharp"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;"><span style="white-space:pre"> </span> private int CreateIndex(BulkDescriptor param)</span></span><pre name="code" class="csharp"> {</pre><pre name="code" class="csharp"> int count = 0;
- var result = client.Bulk(param);
- if (!result.Errors)
- count = result.Items.Count();
- return count;
- }</pre>
- <pre></pre>
- <pre></pre>
- <p></p>
- <pre></pre>
- <pre></pre>
- <p></p>
- <p><span style="font-size:14px"><span style="white-space:pre"></span><strong>5.单个删除索引</strong></span></p>
- <pre name="code" class="csharp"><span style="font-size:14px;"> private int DeleteIndex(ES_PUB_Stock param)
- {
- int indexCnt = 0;
- if (param.sid.GetValueOrDefault(0) > 0)
- {
- var response = client.Delete<ES_PUB_Stock>(param.sid, i => i.Index(IndexName).Type(IndexType));
- if (response.IsValid)
- {
- indexCnt++;
- }
- }
- return indexCnt;
- }</span></pre><span style="font-size:14px"><br>
- </span>
- <p></p>
- <p><span style="font-size:14px">按上方所述,即可实现C#对Elasticsearch的操作。</span></p>
- <p><span style="font-size:14px">NEST对Elasticsearch的结构化查询,待下篇......<br>
- </span><br>
- </p>
- <pre></pre>
- <pre></pre>
- </pre>
ElasticSearch.net NEST批量创建修改删除索引完整示例的更多相关文章
- Linux创建修改删除用户和组
Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...
- MySQL查看、创建和删除索引的方法
本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别 ...
- oracle11g创建修改删除表
oracle11g创建修改删除表 我的数据库名字: ORCL 密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...
- MySQL进阶11--DDL数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制
/*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修 ...
- Cordova之如何用命令行创建一个项目(完整示例)
原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...
- PostgreSQL 查询、创建、删除索引
--查询索引 select * from pg_indexes where tablename='tab1'; --创建索引 tab1_bill_code_index 为索引名, create ind ...
- oracle创建、删除索引等操作
1.创建索引 create index 索引名 on 表名(列名); 2.删除索引 drop index 索引名; 3.创建组合索引 create index 索引名 on 表名(列名1,,列名2); ...
- Linux基础学习-用户的创建修改删除
用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...
- hibernate 批量增加 修改 删除
4.2 Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...
随机推荐
- 【Arduino】、Arduino+ESP8266上传至oneNet云
一.硬件简介 1. Arudino 是一种开源的电子平台,该平台最初主要基于AVR单片机的微控制器和相应的开发软件,包含硬件(各种型号的Arduino板)和软件(Arduino IDE). 2. ES ...
- Hadoop之MapReduce学习笔记(二)
主要内容: mapreduce编程模型再解释: ob提交方式: windows->yarn windows->local : linux->local linux->yarn: ...
- FasterRCNN目标检测实践纪实
首先声明参考博客:https://blog.csdn.net/beyond_xnsx/article/details/79771690?tdsourcetag=s_pcqq_aiomsg 实践过程主线 ...
- Java 设计模式系列(十一)享元模式
Java 设计模式系列(十一)享元模式 Flyweight 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 一.享元模式的结构 享元模式采用一个共享来避免大量拥有相同内容对 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- DataStage 错误集(持续更新)
DataStage 错误集(持续更新) DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 D ...
- 使用类加载器加载配置文件/getClassLoader().getResourceAsStream()
加载配置文件的两种方式; 1. 2. 两者相比,第一种方式更为方便,因为文件目录发生改变就会找不到.
- 20155311 2016-2017-2 《Java程序设计》第8周学习总结
20155311 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 通用API: •日志API • 日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用 ...
- python进行数据清理之pandas中的drop用法
好久好久没有更新博客了,之前自学的估计也都忘记差不多了.由于毕业选择从事的行业与自己的兴趣爱好完全两条路,心情也难过了很久,既然入职了就要好好干,仍要保持自己的兴趣,利用业余时间重拾之前的乐趣. 从基 ...
- Linux C 网络编程——3. TCP套接口编程
1. 基本流程 2. socket() int socket(int domain, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,就像open ...