ElasticSearch入门 第四篇:使用C#添加和更新文档

素颜马尾好姑娘i 2023-06-01 03:26 63阅读 0赞

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:

  1. PM> Install-Package NEST

628084-20170315202811807-1615386129.png

安装之后,系统引用三个DLL文件,楼主安装的驱动程序版本分别是:

  • Elasticsearch.Net.dll (版本 5.0.0.0)
  • Nest.dll (版本 5.0.0.0)
  • Newtonsoft.Json.dll (版本 9.0.0.0)

二,NEST驱动程序的简单使用

1,连接到ElasticSearch引擎服务器

注意,默认索引的名称必须小写,建议将索引名,文档类型名称,和字段名称都小写。

复制代码

  1. using Nest;
  2. public static class Setting
  3. {
  4. public static string strConnectionString=@"http://localhost:9200";
  5. public static Uri Node
  6. {
  7. get
  8. {
  9. return new Uri(strConnectionString);
  10. }
  11. }
  12. public static ConnectionSettings ConnectionSettings
  13. {
  14. get
  15. {
  16. return new ConnectionSettings(Node).DefaultIndex("default");
  17. }
  18. }
  19. }

复制代码

2,创建数据模型

注意,模型的字段名和创建的索引映射中的字段保持一致,推荐都使用小写字母。Nest驱动程序提供了模型属性,读者可以自行尝试。

复制代码

  1. public class MeetupEvents
  2. {
  3. public long eventid { get; set; }
  4. public string orignalid { get; set; }
  5. public string eventname { get; set; }
  6. public string description { get; set; }
  7. }

复制代码

3,更新文档

NEST提供两种更新文档的方式,逐条更新和批量更新,函数PopulateIndex用于逐条更新索引,函数BulkPopulateIndex用于批量更新索引;

注意,在更新索引时,高亮显示的代码指定了索引的元字段_id为meetupevent实体的主键eventid;

复制代码

  1. using Nest;
  2. public class ESProvider
  3. {
  4. public static ElasticClient client = new ElasticClient(Setting.ConnectionSettings);
  5. public static string strIndexName = @"meetup".ToLower();
  6. public static string strDocType = "events".ToLower();
  7. public bool PopulateIndex(MeetupEvents meetupevent)
  8. {
  9. var index = client.Index(meetupevent,i=>i.Index(strIndexName).Type(strDocType).Id(meetupevent.eventid));
  10. return index.Created;
  11. }
  12. public bool BulkPopulateIndex(List<MeetupEvents> posts)
  13. {
  14. var bulkRequest = new BulkRequest(strIndexName,strDocType) { Operations = new List<IBulkOperation>() };
  15. var idxops = posts.Select(o => new BulkIndexOperation<MeetupEvents>(o) { Id=o.eventid}).Cast<IBulkOperation>().ToList();
  16. bulkRequest.Operations = idxops;
  17. var response = client.Bulk(bulkRequest);
  18. return response.IsValid;
  19. }
  20. }

复制代码

4,执行批量更新操作

如果更新的数据量十分庞大,建议,首先对数据源分页,分batch更新ElasticSearch的索引。ElasticSearch在批量索引文档时,如果一批文档数量过大,会导致数据丢失,建议每次索引1000个文档。

复制代码

  1. ESProvider es = new ESProvider();
  2. List<MeetupEvents> pbs = new List<MeetupEvents>();
  3. foreach (DataRow dr in MeetupEventsTable.Rows)
  4. {
  5. MeetupEvents pb = new MeetupEvents();
  6. pb.eventid = long.Parse(dr["EventID"].ToString());
  7. pb.orignalid = dr["OriginalID"].ToString();
  8. pb.eventname = dr["EventName"].ToString();
  9. pb.description = dr["Description"].ToString();
  10. pbs.Add(pb);
  11. }
  12. es.BulkPopulateIndex(pbs);

复制代码

5,总结NEST驱动程序的使用

使用以下三段代码连接NEST客户端:

  1. var node = new Uri("http://myserver:9200");
  2. var settings = new ConnectionSettings(node).DefaultIndex("default");
  3. var client = new ElasticClient(settings);

使用客户端的Index方法更新/添加单个文档:

  1. Client.Index(student);

使用客户端的IndexMany函数更新/添加多个文档:

  1. var list = new List<Student>();
  2. client.IndexMany<Student>(list);

使用客户端的Bulk方法批量更新文档,需要根据实体列表List构造一个BulkRequest参数:

  1. client.Bulk(bulkRequest);

参考文档:

NEST使用指南

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

.net ElasticSearch

作者: 悦光阴

出处: http://www.cnblogs.com/ljhdo/

本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/Jeely/p/11315314.html

发表评论

表情:
评论列表 (有 0 条评论,63人围观)

还没有评论,来说两句吧...

相关阅读

    相关 门第——坚持60秒

    题目描述:菜狗发现最近菜猫不爱理他,反而迷上了菜鸡 题目给的附件是一个jar包,如下图,运行后发现是一个游戏,题目的意思估计是让你玩这个有游戏,坚持60秒就能拿到flag。