这是ElasticSearch 2.4 版本系列的第四篇:

在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);

参考文档:

NEST使用指南

elasticsearch.net search入门使用指南中文版

.net ElasticSearch

ElasticSearch入门 第四篇:使用C#添加和更新文档的更多相关文章

  1. ES4:ElasticSearch 使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:ElasticSearch 集群配置 第三篇:ES3:Ela ...

  2. ES使用C#添加和更新文档

    ElasticSearch 使用C#添加和更新文档 这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:Elas ...

  3. 《ElasticSearch入门》一篇管够,持续更新

    一.顾名思义: Elastic:灵活的:Search:搜索引擎 二.官方简介: Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTf ...

  4. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  5. ElasticSearch入门 第七篇:分词

    这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. ElasticSearch入门 第八篇:存储

    这是ElasticSearch 2.4 版本系列的第八篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  7. ElasticSearch入门 第五篇:使用C#查询文档

    这是ElasticSearch 2.4 版本系列的第五篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  8. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  9. Elasticsearch入门教程(四):Elasticsearch文档CURD

    原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

随机推荐

  1. 在 Azure 中创建通用 VM 的托管映像

    可以从在存储帐户中存储为托管磁盘或非托管磁盘的通用 VM 中创建托管映像资源. 然后可以使用该映像创建多个 VM. 使用 Sysprep 通用化 Windows VM Sysprep 将删除所有个人帐 ...

  2. 转:SqlServer索引及优化详解

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  3. USB AUDIO Device CLASS Requests

    写在前面 本文翻译自 USB Device Class Definition for Audio Devices 1998年版.主要是鄙人个人使用,所以只挑对我有用的翻译.有些我认为不是很重要的可能就 ...

  4. 中断标志位 IRQF_ONESHOT

    one shot本身的意思的只有一次的,结合到中断这个场景,则表示中断是一次性触发的,不能嵌套.对于primary handler,当然是不会嵌套,但是对于threaded interrupt han ...

  5. rename 批量修改文件名简单用法

    有的时候我们需要批量创建文件做测试,为了做区分,一般只要稍稍动动文件名即可,MV命令既可以移动文件,也是可以修改文件名的,但批量修改文件名MV做不到,此时,我们可以用rename命令批量修改是蛮不错的 ...

  6. October 24th, 2017 Week 43rd Tuesday

    We can't give up trying. The fight was worth it. 我们不能放弃尝试,奋斗是值得的. When doing researches in some cutt ...

  7. dns bind配置教程

    实验环境 三台centos7虚拟机,一台ip为192.168.52.130,一台为192.168.52.131,最后一台为192.168.52.132 安装bind 使用yum -y insall b ...

  8. 线程相关代码分析->常见面试题(一、Thead类)

    As always,我们直接看jdk的代码切入: 首先是最简单的Runnable接口: public interface Runnable { public abstract void run(); ...

  9. BZOJ4184:shallot(线段树分治,线性基)

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...

  10. BZOJ3996:[TJOI2015]线性代数(最大权闭合子图)

    Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接 ...