ElasticSearch.net NEST批量创建修改删除索引完整示例

本示例采用Elasticsearch+Nest

网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例。比如新增或修改索引,都是发起一个request新增或修改一条数据,当一次性修改几千条数据时,发起的requst请求过多容易导致429 Too Many Request的错误,单个新增修改索引就非常不适用。其实Nest有批量新增、修改索引的功能,批量删除也可以。现将项目中采用Elasticsearch的C#代码分享如下:

使用NEST客户端

1.连接

[csharp] view plain copy

  1. public ElasticClient GetElasticClient(string esServer, string IndexName)
  2. {
  3. ElasticClient client = null;
  4. string[] server = esServer.Split(‘,‘);
  5. Uri[] nodes = new Uri[server.Length];
  6. for (int i = 0; i < server.Length;i++ )
  7. {
  8. nodes[i] = new Uri(server[i]);
  9. }
  10. var connectionPool = new StaticConnectionPool(nodes);
  11. var settings = new ConnectionSettings(
  12. connectionPool
  13. );
  14. settings.DefaultIndex(IndexName);
  15. client = new ElasticClient(settings);
  16. return client;
  17. }

2.添加索引

[csharp] view plain copy

  1. var indexExist = client.IndexExists(IndexName);
  2. if (!indexExist.Exists)
  3. {
  4. //基本配置
  5. IIndexState indexState = new IndexState()
  6. {
  7. Settings = new IndexSettings()
  8. {
  9. NumberOfReplicas = 1,//副本数
  10. NumberOfShards = 6//分片数
  11. }
  12. };
  13. //ICreateIndexResponse response = client.CreateIndex(IndexName, p => p.Mappings(m => m.Map<ES_PUB_Stock>(mp => mp.AutoMap())));
  14. ICreateIndexResponse response = client.CreateIndex(IndexName, p => p
  15. .InitializeUsing(indexState)
  16. .Mappings(ms =>
  17. ms.Map<ES_PUB_Stock>(m =>
  18. m.AutoMap()
  19. .Properties(ps =>
  20. ps.Nested<ES_PUB_StockPrice>(n =>
  21. n.Name(c => c.stockPrice)
  22. )
  23. .Nested<ES_PUB_SpecValue>(q=>
  24. q.Name(c=>c.specValue))))));
  25. if (response.IsValid)
  26. {
  27. string msg = string.Format("索引创建" + IncrementIndexName + "成功!");
  28. this.WriteLog(msg);
  29. }
  30. else
  31. {
  32. string msg = string.Format("索引创建" + IncrementIndexName + "失败!");
  33. this.WriteLog(msg);
  34. Thread.CurrentThread.Abort();
  35. }
  36. }

这里创建索引设置6个分片数,并Mapping自定义的结构。

Mapping相关类型如下:

[csharp] view plain copy

  1. <span style="font-size:14px;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Nest;
  7. namespace SearchMaker.Model.ES.PUB
  8. {
  9. [ElasticsearchType(IdProperty = "sid", Name = "ES_PUB_Stock")]
  10. public class ES_PUB_Stock
  11. {
  12. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  13. public long? sid { get; set; }
  14. [String(Index = FieldIndexOption.NotAnalyzed)]
  15. public string model { get; set; }
  16. [String(Index = FieldIndexOption.NotAnalyzed)]
  17. public string brand { get; set; }
  18. [String(Index = FieldIndexOption.NotAnalyzed)]
  19. public string encapsulation { get; set; }
  20. [String(Index = FieldIndexOption.NotAnalyzed)]
  21. public string batchNo { get; set; }
  22. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  23. public int invQty { get; set; }
  24. [Date(Format = "yyyy-MM-dd HH:mm:ss")]
  25. public string updateTime { get; set; }
  26. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  27. public int upByMemberID { get; set; }
  28. [String(Index = FieldIndexOption.NotAnalyzed)]
  29. public string upByMemberName { get; set; }
  30. [String(Index = FieldIndexOption.NotAnalyzed)]
  31. public string guid { get; set; }
  32. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  33. public decimal? price { get; set; }
  34. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  35. public int? leastQty { get; set; }
  36. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  37. public int limitTime { get; set; }
  38. [String(Index = FieldIndexOption.NotAnalyzed)]
  39. public string proImg { get; set; }
  40. [String(Index = FieldIndexOption.NotAnalyzed)]
  41. public string categoryNO { get; set; }
  42. [String(Index = FieldIndexOption.NotAnalyzed)]
  43. public string proRemark { get; set; }
  44. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  45. public int type { get; set; }
  46. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  47. public int sendToday { get; set; }
  48. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  49. public int pickedToday { get; set; }
  50. [String(Index = FieldIndexOption.NotAnalyzed)]
  51. public string categoryName { get; set; }
  52. [Object(Path = "specValue")]
  53. public List<ES_PUB_SpecValue> specValue { get; set; }
  54. [Object(Path = "stockPrice")]
  55. public List<ES_PUB_StockPrice> stockPrice { get; set; }
  56. [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
  57. public string specsName { get; set; }
  58. [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
  59. public string keyword { get; set; }
  60. [String(Analyzer = "ik", Index = FieldIndexOption.Analyzed)]
  61. public string modelAS { get; set; }
  62. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  63. public int modelLength { get; set; }
  64. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  65. public decimal score { get; set; }
  66. }
  67. [ElasticsearchType(Name = "ES_PUB_StockPrice")]
  68. public class ES_PUB_StockPrice
  69. {
  70. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  71. public int? minval { get; set; }
  72. [Number(Index = NonStringIndexOption.NotAnalyzed, DocValues = false, IgnoreMalformed = true, Coerce = true)]
  73. public decimal? price { get; set; }
  74. }
  75. [ElasticsearchType(Name = "ES_PUB_Specs")]
  76. public class ES_PUB_SpecValue
  77. {
  78. [String(Index = FieldIndexOption.NotAnalyzed)]
  79. public string spec { get; set; }
  80. [String(Index = FieldIndexOption.NotAnalyzed)]
  81. public string value { get; set; }
  82. }
  83. }
  84. </span>

这里中文分词采用IK分词

3.单个新增、修改索引

[csharp] view plain copy

  1. <span style="font-size:14px;">        private int CreateIndex(ES_PUB_Stock param)
  2. {
  3. int indexCnt = 0;
  4. if (param.sid.GetValueOrDefault(0) > 0)
  5. {
  6. var response = client.Index<ES_PUB_Stock>(param, i => i.Index(IndexName).Type(IndexType));
  7. if (response.IsValid)
  8. {
  9. indexCnt++;
  10. }
  11. else
  12. {
  13. this.WriteWarmessage("创建" + IncrementIndexName + "索引,发生异常:SID:" + param.sid.ToString() + "," + response.DebugInformation, "");
  14. }
  15. }
  16. return indexCnt;
  17. }</span>

4.批量新增、修改索引

[csharp] view plain copy

    1. <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;
    2. var result = client.Bulk(param);
    3. if (!result.Errors)
    4. count = result.Items.Count();
    5. return count;
    6. }</pre>
    7. <pre></pre>
    8. <pre></pre>
    9. <p></p>
    10. <pre></pre>
    11. <pre></pre>
    12. <p></p>
    13. <p><span style="font-size:14px"><span style="white-space:pre"></span><strong>5.单个删除索引</strong></span></p>
    14. <pre name="code" class="csharp"><span style="font-size:14px;">  private int DeleteIndex(ES_PUB_Stock param)
    15. {
    16. int indexCnt = 0;
    17. if (param.sid.GetValueOrDefault(0) > 0)
    18. {
    19. var response = client.Delete<ES_PUB_Stock>(param.sid, i => i.Index(IndexName).Type(IndexType));
    20. if (response.IsValid)
    21. {
    22. indexCnt++;
    23. }
    24. }
    25. return indexCnt;
    26. }</span></pre><span style="font-size:14px"><br>
    27. </span>
    28. <p></p>
    29. <p><span style="font-size:14px">按上方所述,即可实现C#对Elasticsearch的操作。</span></p>
    30. <p><span style="font-size:14px">NEST对Elasticsearch的结构化查询,待下篇......<br>
    31. </span><br>
    32. </p>
    33. <pre></pre>
    34. <pre></pre>
    35. </pre>
时间: 2024-10-16 18:44:30

ElasticSearch.net NEST批量创建修改删除索引完整示例的相关文章

开源私有云平台Nano v0.8.1发布 - 批量创建与删除

大家好,Nano 0.8.1面世了. 距离1.0发布越来越近,Nano的基本功能和稳定性也逐步完善,我们终于可以有精力开始完善用户体验和提升管理效率了.进入新版本,首先看到最大的变化,就是主菜单从顶部挪到了侧边栏,界面更加紧凑,同时也有利于后续扩展更多功能. 其次在云主机列表界面里,增加了批量创建与删除功能.批量创建功能能够一次性创建一批配置相同的云主机,批量创建与原有创建功能一样,同样能够选择从源镜像克隆或者使用CloudInit进行实例初始化,极大地提升了资源分配效率. 同样地,在云主机列表

mysql命令行下创建和删除索引简介

mysql命令行下创建和删除索引简介: mysql中创建索引可以使用CREATE TABLE语句,也可以用CREATE INDEX或ALTER TABLE来给表增加索引.索引的删除可以使用ALTER TABLE或DROP INDEX语句来实现. (1)使用ALTER TABLE语句创建索引.语法如下:alter table table_name add index index_name (column_list) ;alter table table_name add unique (colum

Linux创建修改删除用户和组

Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先从用户信息开始分析,可以通过查询/etc/password文件,每一行代表一个用户信息 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin m

创建与删除索引

索引是加速查询的主要手段,特别对于涉及多个表的查询更是如此.本节中,将介绍索引的作用.特点,以及创建和删除索引的语法. 13.4.1  使用索引优化查询 索引是高速定位数据的技术,首先通过一个演示样例来了解其含义及作用,具体的介绍请參考第14章. 1.索引演示样例 如果对于10.3节所建的表,各个表上都没有索引,数据的排列也没有规律,如表13.3所看到的. 表13.3                                                     没有索引的student

DDL 数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制

/*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修改: alter 删除: DROP DATABASE [IF EXISTS] 库名; */ #一 : 库的管理 #1 库的创建 CREATE DATABASE books; CREATE DATABASE IF NOT EXISTS books; #2/库的修改 #库名的修改,需要停止服务器,然后修

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

PostgreSQL 查询、创建、删除索引

--查询索引 select * from pg_indexes where tablename='tab1'; --创建索引 tab1_bill_code_index 为索引名, create index tab1_bill_code_index on "db1".tab1(bill_code); --删除索引 drop index tab1_bill_code_index ; 原文地址:https://www.cnblogs.com/personblog/p/11368104.htm

oracle创建、删除索引等操作

1.创建索引 create index 索引名 on 表名(列名);12.删除索引 drop index 索引名;13.创建组合索引 create index 索引名 on 表名(列名1,,列名2);14.查询索引 --根据索引名,查询表索引字段select * from user_ind_columns where index_name='索引名';--根据表名,查询一张表的索引select * from user_indexes where table_name='表名';—————————

Linux基础学习-用户的创建修改删除

用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [[email protected] ~]# useradd -u 3000 -d /home/haha hehe hehe:x:3000:3000::/home/haha:/bin/bash [[email protected] ~]# ls /home/ haha 这里-u是uid,-g可以指定组id,不定值系统自动分配,-G可以指定附加组,如果不想让用户登录系统可以指定