本示例采用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 SniffingConnectionPool(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相关类型如下:

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; }}
}

这里中文分词采用IK分词

3.单个新增、修改索引

        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;}

4.批量新增、修改索引

 BulkDescriptor descriptor = new BulkDescriptor();
 descriptor.Index<ES_PUB_Stock>(op => op.Document(esStock));
        private int CreateIndex(BulkDescriptor param)
 {
            int count = 0;var result = client.Bulk(param);if (!result.Errors)count = result.Items.Count();return count;}

5.单个删除索引

 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;}

按上方所述,即可实现C#对Elasticsearch的操作。

NEST对Elasticsearch的结构化查询,待下篇......

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

  1. elasticsearch手动创建和删除索引

    elasticsearch手动创建和删除索引 在ElasticSearch没有索引的情况下,插入文档,默认会自动创建索引和索引映射,从而无法使用ik分词器.因此需要手动创建索引,取消默认创建机制. / ...

  2. 合肥工业大学—SQL Server数据库实验五:创建和删除索引

    创建和删除索引 1. 用SQL语句建立索引 2. 用SQL语句删除索引Stuspno 1. 用SQL语句建立索引 (1)应用场景:在教务管理系统中,经常需要通过学生的姓名查询学生的基本信息,学生人数大 ...

  3. mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除

    [数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...

  4. MySQL笔记5:如何创建和删除索引?

    MySQL数据库中如何创建和删除索引? 一.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引. 1.使用CREA ...

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

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

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

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

  7. linux批量创建和删除用户

    linux批量创建和删除用户 我们都知道可以用useraddxxxx可以建立用户,passwd xxx可以为用户建立密码,如果我们要批量创建好多好多呢,怎么办??接下来我们一起来看个实例,一起来做一下 ...

  8. linux 批量删除任务,Linux-Shell脚本学习心得之批量创建、删除用户

    继上次博文,继续为大家分享脚本实例:批量创建.删除用户 说到,用户的管理,大家都不会陌生,就是创建.删除.禁用等等的管理,但,大多都是管 理员手工操作,效率不是很高,今天,就给大家说说Shell脚本是 ...

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

    大数据技术之_20_Elasticsearch学习_01 一 概述 1.1 什么是搜索? 1.2 如果用数据库做搜索会怎么样? 1.3 什么是全文检索和 Lucene? 1.4 什么是 Elastic ...

最新文章

  1. python完美立方数_Python练习实例3 | 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?...
  2. 如何从ActiveMQ平滑迁移到Kafka?
  3. java 执行linux命令行_10个高效Linux技巧及Vim命令对比
  4. Linux上的ftp配置,及错误500 OOPS: could not bind listening IPv4 socket解决
  5. android 城市列表数据,用RecyclerView写的城市列表
  6. 企业类库 add access 2007
  7. 【2012百度之星资格赛】J:百度的新大厦
  8. Android5.1--电源管理之省电模式分析
  9. 看法:2017会带给我们的文化和方法
  10. mysql 导出er图工具_mysql 反向生成 er图
  11. 《风暴英雄》游戏体验
  12. 使用U盘重装win10系统
  13. 国内优秀的多用户商城系统盘点(2022年整理)
  14. Windows-电脑蓝屏问题
  15. JAVA 知识点 | Hook
  16. 欧美女性flash网页模板
  17. fairyGUI界面控件的基本制作和功能实现
  18. VisualBox解决CentOS中yum安装失败的问题
  19. .NET MEF托管可扩展框架
  20. 查询不同老师所教不同课程平均分从高到低显示

热门文章

  1. 跨境电商适合做独立站吗,是入平台好还是独立站好?
  2. 元宇宙类电影这里全了!
  3. 工作一到五年的Java程序员该如何提升自己?
  4. 写点看Harvard CS50 公开课的感受
  5. 什么是私域裂变营销?
  6. 元宇宙:虚拟仿真技术的全面提升
  7. 计算机网络汇聚层,【大白电气】接入层、汇聚层、核心层——中大型计算机网络系统结构介绍及交换机选型建议...
  8. Jmeter线程组之jp@gc - Stepping Thread Group
  9. dispatch emit broadcast
  10. 残差网络ResNet到ResNeXt解读,最强ResNeXt预训练模型已开源及如何使用