本示例采用Elasticsearch+Nest

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

使用NEST客户端

1.连接

  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.添加索引

  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相关类型如下:

  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.单个新增、修改索引

  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.批量新增、修改索引

    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>

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

  1. Linux创建修改删除用户和组

    Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...

  2. MySQL查看、创建和删除索引的方法

    本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别 ...

  3. oracle11g创建修改删除表

    oracle11g创建修改删除表 我的数据库名字: ORCL         密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...

  4. MySQL进阶11--DDL数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制

    /*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修 ...

  5. Cordova之如何用命令行创建一个项目(完整示例)

    原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...

  6. PostgreSQL 查询、创建、删除索引

    --查询索引 select * from pg_indexes where tablename='tab1'; --创建索引 tab1_bill_code_index 为索引名, create ind ...

  7. oracle创建、删除索引等操作

    1.创建索引 create index 索引名 on 表名(列名); 2.删除索引 drop index 索引名; 3.创建组合索引 create index 索引名 on 表名(列名1,,列名2); ...

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

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  9. hibernate 批量增加 修改 删除

    4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...

随机推荐

  1. Python列表练习题

    1.创建一个空列表,命名为names,往里面添加 Lihua.Rain.Jack.Xiuxiu.Peiqi和Black元素. #!-*- coding:utf-8 -*- names = [" ...

  2. PLSQL Developer工具的使用

    1.运行 2.字体大小 导入csv文件. 任何工具都有失败的可能, 这个时候,也失败了. 当然还有另一种可能,文件被人为改过了,括号改过了,就即使使用下面的kettle工具也没用了.这时可以导出文件对 ...

  3. Halcon二维仿射变换实例探究

    二维仿射变换,顾名思义就是在二维平面内,对对象进行平移.旋转.缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的). Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d ...

  4. ecshop适配php

    https://www.cnblogs.com/xiwang6428/p/5460155.html

  5. 安装系统重启的时候出现了error:file '/boot/grub/i386-pc/normal.mod' not found

    1.直接进入系统的时候只出现grub rescue的命令行 可以使用的命令有set和 ls 在用ls命令查看 磁盘的分区情况其中hd0 代表第一块硬盘 hd1代表第二块 使用ls 来查看存在那些系统, ...

  6. Devexpress VCL Build v2013 vol 13.2.2 发布

    devexpress 2013 的第二个大版本出来了,一如既往, 基本上还是一个大补丁包.各位看官,自己看. What's New in 13.2.2 (VCL Product Line)   New ...

  7. 二)quartz.properties

    The Properties File Quartz uses a properties file called (kudos on the originality) quartz.propertie ...

  8. .NET基础 (13)IFormattable和IformatProvider的使用

    IFormattable和IformatProvider的使用1 如何使用IFormattable接口实现格式化输出2 如何告诉类型格式化输出的方式 IFormattable和IformatProvi ...

  9. zstu4273 玩具 2017-03-22 14:18 49人阅读 评论(0) 收藏

    4273: 玩具 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 700  Solved: 129 Description 商店有n个玩具,第i个玩具有 ...

  10. 深水划水队项目---七天冲刺之day5

    站立式会议: 因为今天有成员回家,不能进行线下站立式会议,只能线上进行语音聊天 工作进度:  昨天完成的任务: 游戏功能的基本实现 商讨出如何实现游戏中的难度选择功能与道具功能 商讨出站立式会议能线下 ...