ES4:ElasticSearch 使用C#添加和更新文档
这是ElasticSearch 2.4 版本系列的第四篇:
- ElasticSearch入门 第一篇:Windows下安装ElasticSearch
- ElasticSearch入门 第二篇:集群配置
- ElasticSearch入门 第三篇:索引
- ElasticSearch入门 第四篇:使用C#添加和更新文档
- ElasticSearch入门 第五篇:使用C#查询文档
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
- ElasticSearch入门 第七篇:分析器
- ElasticSearch入门 第八篇:存储
- ElasticSearch入门 第九篇:实现正则表达式查询的思路
在ElasticSearch引擎中进行全文搜索是一件非常酷炫的事,而创建索引是最重要的事,必须要精心设计,建议使用head插件创建索引的映射(Mapping),而对索引文档数据的日常更新,可以使用C#客户端程序,按照计划自动进行数据的同步和更新。
对于一个数据库开发,很久没有写过C#代码,dot net菜鸟一个,本文简单分享了使用ElasticSearch的.net客户端驱动程序向索引中添加文档的代码片段,详细信息,请参考官方手册:Elasticsearch.Net and NEST: the .NET clients [5.x] » Introduction
一,ElasticSearch的.net客户端驱动程序
ElasticSearch官方网站提供了两个.net客户端驱动程序,其中Elasticsearch.Net是一个非常底层且灵活的客户端驱动程序,用户需要手动创建请求(Request)和响应(Response);而NEST是一个高层的客户端,其内部使用的依然是Elasticsearch.Net驱动程序,NEST拥有查询DSL(领域特定语言),能够映射所有请求和响应对象,使用起来比较方便。不同版本的NEST驱动程序,其提供的接口变化很大,在熟悉Nest之后,可以使用Elasticsearch.Net驱动程序来编写自己的代码,免受更新之苦。
首先,下载ElastiSearch的.net客户端驱动程序,打开VS的工具(Tools)菜单,通过NuGet包管理器控制台,输入命令安装NEST:
PM> Install-Package NEST

安装之后,系统引用三个DLL文件,楼主安装的驱动程序版本分别是:
- Elasticsearch.Net.dll (版本 5.0.0.0)
- Nest.dll (版本 5.0.0.0)
- Newtonsoft.Json.dll (版本 9.0.0.0)
二,NEST驱动程序的简单使用
1,连接到ElasticSearch引擎服务器
注意,默认索引的名称必须小写,建议将索引名,文档类型名称,和字段名称都小写。
using Nest;
public static class Setting
{
public static string strConnectionString=@"http://localhost:9200";
public static Uri Node
{
get
{
return new Uri(strConnectionString);
}
}
public static ConnectionSettings ConnectionSettings
{
get
{
return new ConnectionSettings(Node).DefaultIndex("default");
}
}
}
2,创建数据模型
注意,模型的字段名和创建的索引映射中的字段保持一致,推荐都使用小写字母。Nest驱动程序提供了模型属性,读者可以自行尝试。
public class MeetupEvents
{
public long eventid { get; set; }
public string orignalid { get; set; }
public string eventname { get; set; }
public string description { get; set; }
}
3,更新文档
NEST提供两种更新文档的方式,逐条更新和批量更新,函数PopulateIndex用于逐条更新索引,函数BulkPopulateIndex用于批量更新索引;
注意,在更新索引时,高亮显示的代码指定了索引的元字段_id为meetupevent实体的主键eventid;
using Nest;
public class ESProvider
{
public static ElasticClient client = new ElasticClient(Setting.ConnectionSettings);
public static string strIndexName = @"meetup".ToLower();
public static string strDocType = "events".ToLower(); public bool PopulateIndex(MeetupEvents meetupevent)
{
var index = client.Index(meetupevent,i=>i.Index(strIndexName).Type(strDocType).Id(meetupevent.eventid));
return index.Created;
} public bool BulkPopulateIndex(List<MeetupEvents> posts)
{
var bulkRequest = new BulkRequest(strIndexName,strDocType) { Operations = new List<IBulkOperation>() };
var idxops = posts.Select(o => new BulkIndexOperation<MeetupEvents>(o) { Id=o.eventid}).Cast<IBulkOperation>().ToList();
bulkRequest.Operations = idxops;
var response = client.Bulk(bulkRequest);
return response.IsValid;
}
}
4,执行批量更新操作
如果更新的数据量十分庞大,建议,首先对数据源分页,分batch更新ElasticSearch的索引。ElasticSearch在批量索引文档时,如果一批文档数量过大,会导致数据丢失,建议每次索引1000个文档。
ESProvider es = new ESProvider();
List<MeetupEvents> pbs = new List<MeetupEvents>(); foreach (DataRow dr in MeetupEventsTable.Rows)
{
MeetupEvents pb = new MeetupEvents();
pb.eventid = long.Parse(dr["EventID"].ToString());
pb.orignalid = dr["OriginalID"].ToString();
pb.eventname = dr["EventName"].ToString();
pb.description = dr["Description"].ToString(); pbs.Add(pb);
}
es.BulkPopulateIndex(pbs);
5,总结NEST驱动程序的使用
使用以下三段代码连接NEST客户端:
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node).DefaultIndex("default");
var client = new ElasticClient(settings);
使用客户端的Index方法更新/添加单个文档:
Client.Index(student);
使用客户端的IndexMany函数更新/添加多个文档:
var list = new List<Student>();
client.IndexMany<Student>(list);
使用客户端的Bulk方法批量更新文档,需要根据实体列表List构造一个BulkRequest参数:
client.Bulk(bulkRequest);
参考文档:
elasticsearch.net search入门使用指南中文版
ES4:ElasticSearch 使用C#添加和更新文档的更多相关文章
- ES使用C#添加和更新文档
ElasticSearch 使用C#添加和更新文档 这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:Elas ...
- ElasticSearch入门 第四篇:使用C#添加和更新文档
这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- elasticsearch 基础 —— 索引、更新文档
索引文档 通过使用 index API ,文档可以被 索引 -- 存储和使文档可被搜索 . 但是首先,我们要确定文档的位置.正如我们刚刚讨论的,一个文档的 _index . _type 和 _id 唯 ...
- Elasticsearch 更新文档
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- REST API (更新文档)
Elasticsearch的更新文档API准许通过脚本操作来更新文档.更新操作从索引中获取文档,执行脚本,然后获得返回结果.它使用版本号来控制文档获取或者重建索引. 我们新建一个文档: 请求:PUT ...
- ElasticSearch权威指南学习(分布式文档存储)
路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...
- Elasticsearch从入门到放弃:文档CRUD要牢记
在Elasticsearch中,文档(document)是所有可搜索数据的最小单位.它被序列化成JSON存储在Elasticsearch中.每个文档都会有一个唯一ID,这个ID你可以自己指定或者交给E ...
- MongoDB更新文档
说明:来看一下关系型数据库的update语句 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某 其中where子句就类似查询文本,定位要更改的子表,set子句类似于修改器,更 ...
- SharePoint 更新文档库文档标题(Title)字段
前言:记录下写代码中遇到的小问题,帮同事写一个批量更新文档库标题字段的小程序,本来以为就Update一下就可以了,10分钟可以搞定.结果10分钟过去了,代码写好了,执行起来不报错,调试也没问题,只是要 ...
随机推荐
- Flex之HTML5视频播放解决方案
Flex的video类对于视频播放在ios操作系统下表现出不兼容,采用调用ios源生播放器的思路,那么怎么调呢? 话说Html5 和Flex是竞争关系,这次利用Html5的video标签实现ios播放 ...
- easyUI progressbar组件
easyUI progressbar组件: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- MVC伪一个12306图片验证码
本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...
- 基于ssh反向代理实现的远程协助
本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...
- iOS实现白板、画板功能,有趣的涂鸦工具,已封装,简单快捷使用
一.效果图: 二.选择颜色: 分[固定颜色模式]和[自由取模式]. 三.操作栏功能: 1.撤销:撤销上一步操作,可一直往上进行,直到全部清空. 2.清空:直接清除所有绘画. 3.橡皮擦:去除不要的绘 ...
- JS数组处理
一.定义数组: 方法1 var myCars=new Array(); myCars[0]="Saab"; myCars[1]="Volvo"; myCars[ ...
- CSS3知识点整理(四)----布局样式及其他
包括CSS3多列布局样式.Flexbox伸缩布局.盒子模型等.重点介绍了Flexbox伸缩布局的各种属性用法. 一.多列布局 为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给 ...
- asp.net core mvc剖析:处理管道构建
在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建.在来看一下代码: ...... //这个调用的就是Startup.cs类中的Config ...
- 警惕Dictionary和SortedDictionary的顺序陷阱
/*我们查询资料得知Dictionary的遍历顺序和添加Add时的顺序是一致的,不像 HashTable 顺序不可知;于是我要依赖Dictionary的这种顺序一致特性做一个,固定大小400长度的队列 ...
- 【前端】:JavaScript
前言: 开始学JavaScript,Dom,jQuery了,知识好杂,本身记忆力就不行的~~这篇博客简单介绍下JavaScript. 下篇博客写关于Dom的. JavaScript是一门编程语言(之前 ...