应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.NET Core使用ElasticSearch 三:常用帮助类封装

7324人阅读 2021/7/14 17:18 总访问:5182754 评论:3 收藏:1 手机
分类: .NET Core

把.NET CORE操作ElasticSearch的常用方法封装成帮助类,包含查询的封装,操作索引相关的封装,删除,更新等等等。基于ES7.12.0,以前早一点版本的写法有些用法都不一样了,重新封装一下。
写了我好久

  1. namespace ElasticsearchLearn.ElasticSearch
  2. {
  3.     public static class ElasticsearchExtands
  4.     {
  5.         /// <summary>
  6.         /// 封装后的linq的查询方式
  7.         /// </summary>
  8.         /// <typeparam name="T">实体泛型</typeparam>
  9.         /// <param name="indexName">index的名称</param>
  10.         /// <param name="selector">linq内容</param>
  11.         /// <returns></returns>
  12.         public static async Task<List<T>> SearchByLinqAsync<T>(this IElasticSearchServer elasticSearchServer, string indexName, Func<QueryContainerDescriptor<T>, QueryContainer> selector = nullwhere T : class
  13.         {
  14.             var list = await elasticSearchServer.ElasticLinqClient.SearchAsync<T>(option => option.Index(indexName.ToLower()).Query(selector));
  15.             return list.Documents.ToList();
  16.         }
  17.         /// <summary>
  18.         /// 封装后的Json的查询方式
  19.         /// </summary>
  20.         /// <param name="indexName">index的名称</param>
  21.         /// <param name="jsonString">json字符串</param>
  22.         /// <returns>返回Jobject的内容</returns>
  23.         public static async Task<JToken> SearchByJsonAsync(this IElasticSearchServer elasticSearchServer, string indexName, string jsonString)
  24.         {
  25.             var stringRespones = await elasticSearchServer.ElasticJsonClient.SearchAsync<StringResponse>(indexName.ToLower(), jsonString);
  26.             var jobject = JObject.Parse(stringRespones.Body);
  27.             var total = Convert.ToInt32(jobject["hits"]["total"]["value"].ToString());
  28.             if (total > 0)
  29.             {
  30.                 string json = string.Empty;
  31.                 var sourceArg = jobject["hits"]["hits"];
  32.                 foreach (var source in sourceArg)
  33.                 {
  34.                     string sourceJson = source["_source"].ToString().Substring(1, source["_source"].ToString().Length - 1);
  35.                     sourceJson = "{ \"_id\":\"" + source["_id"] + "\"," + sourceJson;
  36.                     if (json.Length <= 0)
  37.                         json += sourceJson;
  38.                     else
  39.                         json += "," + sourceJson;
  40.                 }
  41.                 return JToken.Parse("[" + json + "]");
  42.             }
  43.             return null;
  44.         }
  45.         /// <summary>
  46.         /// 通过索引与id检查文档是否已经存在
  47.         /// </summary>
  48.         /// <param name="index">索引</param>
  49.         /// <param name="id">id</param>
  50.         /// <returns></returns>
  51.         public static async Task<boolSourceExistsAsync(this IElasticSearchServer elasticSearchServer, string index, string id)
  52.         {
  53.             bool flag = false;
  54.             StringResponse resStr = null;
  55.             try
  56.             {
  57.                 //elasticSearchServer.ElasticJsonClient.Indices.Exists()
  58.                 resStr = await elasticSearchServer.ElasticJsonClient.SourceExistsAsync<StringResponse>(index, id);
  59.                 if (resStr.HttpStatusCode == 200)
  60.                 {
  61.                     flag = true;
  62.                 }
  63.             }
  64.             catch (Exception ex)
  65.             {
  66.             }
  67.             return flag;
  68.         }
  69.         /// <summary>
  70.         /// 检测索引是否已经存在
  71.         /// </summary>
  72.         /// <param name="index"></param>
  73.         /// <returns></returns>
  74.         public static async Task<boolIsIndexExsit(this IElasticSearchServer elasticSearchServer, string index)
  75.         {
  76.             bool flag = false;
  77.             StringResponse resStr = null;
  78.             try
  79.             {
  80.                 resStr = await elasticSearchServer.ElasticJsonClient.Indices.ExistsAsync<StringResponse>(index);
  81.                 if (resStr.HttpStatusCode == 200)
  82.                 {
  83.                     flag = true;
  84.                 }
  85.             }
  86.             catch (Exception ex)
  87.             {
  88.             }
  89.             return flag;
  90.         }
  91.         
  92.         /// <summary>
  93.         /// 创建index
  94.         /// </summary>
  95.         /// <param name="indexName"></param>
  96.         /// <param name="shards">分片数量,即数据块最小单元</param>
  97.         /// <returns></returns>
  98.         public static async Task<boolCreateIndexAsync(this IElasticSearchServer elasticSearchServer, string indexName, int shards = 5)
  99.         {
  100.             var isHaveIndex = await IsIndexExsit(elasticSearchServer, indexName.ToLower());
  101.             if (!isHaveIndex)
  102.             {
  103.                 var stringResponse = await elasticSearchServer.ElasticJsonClient.Indices.CreateAsync<StringResponse>(indexName.ToLower(),
  104.                         PostData.String($"{{\"settings\" : {{\"index\" : {{\"number_of_replicas\" : 0, \"number_of_shards\":\"{shards}\",\"refresh_interval\":\"-1\"}}}}}}"));
  105.                 var resObj = JObject.Parse(stringResponse.Body);
  106.                 if ((bool)resObj["acknowledged"])
  107.                 {
  108.                     return true;
  109.                 }
  110.             }
  111.             else
  112.             {
  113.                 return true;
  114.             }
  115.             return false;
  116.         }
  117.         /// <summary>
  118.         /// 删除index
  119.         /// </summary>
  120.         /// <param name="indexName"></param>
  121.         /// <returns></returns>
  122.         public static async Task<boolDeleteIndexAsync(this IElasticSearchServer elasticSearchServer, string indexName)
  123.         {
  124.             var stringRespones = await elasticSearchServer.ElasticJsonClient.Indices.DeleteAsync<StringResponse>(indexName.ToLower());
  125.             var resObj = JObject.Parse(stringRespones.Body);
  126.             if ((bool)resObj["acknowledged"])
  127.             {
  128.                 return true;
  129.             }
  130.             return false;
  131.         }
  132.         /// <summary>
  133.         /// 插入单个文档
  134.         /// </summary>
  135.         /// <param name="indexName">索引名称</param>
  136.         /// <param name="objectDocment">文档内容</param>
  137.         /// <param name="_id">自定义_id</param>
  138.         /// <returns></returns>
  139.         public static async Task<boolInsertDocumentAsync(this IElasticSearchServer elasticSearchServer, string indexName, object objectDocment, string _id = "")
  140.         {
  141.             var stringRespones = new StringResponse();
  142.             if (_id.Length > 0)
  143.                 stringRespones = await elasticSearchServer.ElasticJsonClient.IndexAsync<StringResponse>(indexName.ToLower(), _id, PostData.String(JsonConvert.SerializeObject(objectDocment)));
  144.             else
  145.                 stringRespones = await elasticSearchServer.ElasticJsonClient.IndexAsync<StringResponse>(indexName.ToLower(), PostData.String(JsonConvert.SerializeObject(objectDocment)));
  146.             var resObj = JObject.Parse(stringRespones.Body);
  147.             if ((int)resObj["_shards"]["successful"] > 0)
  148.             {
  149.                 return true;
  150.             }
  151.             return false;
  152.         }
  153.         /// <summary>
  154.         /// 删除单个文档
  155.         /// </summary>
  156.         /// <param name="indexName">索引名称</param>
  157.         /// <param name="_id">要删除的id</param>
  158.         /// <returns></returns>
  159.         public static async Task<boolDeleteDocumentAsync(this IElasticSearchServer elasticSearchServer, string indexName, string _id)
  160.         {
  161.             bool flag = false;
  162.             StringResponse resStr = null;
  163.             try
  164.             {
  165.                 resStr = await elasticSearchServer.ElasticJsonClient.DeleteAsync<StringResponse>(indexName.ToLower(), _id);
  166.                 var resObj = JObject.Parse(resStr.Body);
  167.                 if ((int)resObj["_shards"]["total"] == 0 || (int)resObj["_shards"]["successful"] > 0)
  168.                 {
  169.                     flag = true;
  170.                 }
  171.             }
  172.             catch (Exception ex)
  173.             {
  174.             }
  175.             return flag;
  176.         }
  177.         /// <summary>
  178.         /// 更新文档  
  179.         /// </summary>
  180.         /// <param name="indexName">索引名称</param>
  181.         /// <param name="_id">文档id</param>
  182.         /// <param name="objectDocment">文档内容</param>
  183.         /// <returns></returns>
  184.         public static async Task<boolUpdateDocumentAsync(this IElasticSearchServer elasticSearchServer, string indexName, string id, object objectDocment)
  185.         {
  186.             bool flag = false;
  187.             try
  188.             {
  189.                 string json = JsonConvert.SerializeObject(objectDocment);
  190.                 var updateToJson = "{\"doc\":" + json + "}";
  191.                 var stringRespones = await elasticSearchServer.ElasticJsonClient.UpdateAsync<StringResponse>(indexName, id, PostData.String(updateToJson));
  192.                 var resObj = JObject.Parse(stringRespones.Body);
  193.                 if ((int)resObj["_shards"]["successful"] > 0)
  194.                 {
  195.                     return true;
  196.                 }
  197.             }
  198.             catch { }
  199.             return flag;
  200.         }
  201.         /// <summary>
  202.         /// 通过Bulk更新文档  
  203.         /// </summary>
  204.         /// <param name="indexName">索引名称</param>
  205.         /// <param name="_id">文档id</param>
  206.         /// <param name="objectDocment">文档内容</param>
  207.         /// <returns></returns>
  208.         public static async Task<boolUpdateDocumentByBulkAsync(this IElasticSearchServer elasticSearchServer, string indexName, string _id, object objectDocment)
  209.         {
  210.             bool flag = false;
  211.             try
  212.             {
  213.                 string json = JsonConvert.SerializeObject(objectDocment);
  214.                 if (json.IndexOf("[") == 0)
  215.                 {
  216.                     var objectDocmentOne = JToken.Parse(json);
  217.                     json = JsonConvert.SerializeObject(objectDocmentOne[0]);
  218.                 }
  219.                 int idInt = json.IndexOf("\"_id");
  220.                 if (idInt > 0)
  221.                 {
  222.                     string idJson = json.Substring(idInt, json.IndexOf(_id) + _id.Length + 1);
  223.                     json = json.Replace(idJson, "");
  224.                 }
  225.                 List<string> list = new List<string>();
  226.                 list.Add("{\"update\":{\"_id\":\"" + _id + "\"}}");
  227.                 list.Add("{\"doc\":" + json + "}");
  228.                 var stringRespones = await elasticSearchServer.ElasticJsonClient.BulkAsync<StringResponse>(indexName.ToLower(), PostData.MultiJson(list));
  229.                 var resObj = JObject.Parse(stringRespones.Body);
  230.                 if (!(bool)resObj["errors"])
  231.                 {
  232.                     return true;
  233.                 }
  234.             }
  235.             catch { }
  236.             return flag;
  237.         }
  238.     }
  239. }

在控制器中测试的代码如下:

  1. namespace ElasticsearchLearn.Controllers
  2. {
  3.     public class HomeController : Controller
  4.     {
  5.         private readonly ILogger<HomeController> _logger;
  6.         private readonly IElasticSearchServer _elasticSearchServer;
  7.         public HomeController(ILogger<HomeController> logger, IElasticSearchServer elasticSearchServer)
  8.         {
  9.             _logger = logger;
  10.             _elasticSearchServer = elasticSearchServer;
  11.         }
  12.         public IActionResult Index()
  13.         {
  14.             return View();
  15.         }
  16.         /// <summary>
  17.         /// 基于Linq的查询
  18.         /// </summary>
  19.         public async Task<List<Persons>> SearchByLinq(string user = "批量")
  20.         {
  21.             var list = await _elasticSearchServer.SearchByLinqAsync<Persons>("users", op => op.Match(
  22.                                            ss => ss.Field(
  23.                                                qq => qq.user == user)));
  24.             return list;
  25.         }
  26.         /// <summary>
  27.         /// 基于Json的查询
  28.         /// </summary>
  29.         public async Task<stringSearchByJson(string user = "批量")
  30.         {
  31.             var jsonobject = new { query = new { match = new { user = "批量" } } };
  32.             string json = JsonConvert.SerializeObject(jsonobject);
  33.             var jToken = await _elasticSearchServer.SearchByJsonAsync("users", json);
  34.             return jToken.ToString();
  35.         }
  36.         /// <summary>
  37.         /// 插入单个文档
  38.         /// </summary>
  39.         /// <param name="indexName">索引名称</param>
  40.         /// <param name="objectDocment">文档内容</param>
  41.         /// <param name="_id">自定义_id</param>
  42.         /// <returns></returns>
  43.         public async Task<boolInsertDocument()
  44.         {
  45.             var content = new
  46.             {
  47.                 user = "嘻嘻",
  48.                 post_date = "2021-10-11T15:00:12",
  49.                 message = "...."
  50.             };
  51.             bool result = await _elasticSearchServer.InsertDocumentAsync("users", content, "1");
  52.             return result;
  53.         }
  54.         /// <summary>
  55.         /// 删除单个文档
  56.         /// </summary>
  57.         /// <param name="index"></param>
  58.         /// <param name="id"></param>
  59.         /// <returns></returns>
  60.         public async Task<boolDeleteDocument(string index = "users"string id = "2")
  61.         {
  62.             bool result = await _elasticSearchServer.DeleteDocumentAsync(index, id);
  63.             return result;
  64.         }
  65.         /// <summary>
  66.         /// 通过Bulk更新文档  
  67.         /// </summary>
  68.         /// <returns></returns>
  69.         public async Task<boolUpdateDocumentByBulk()
  70.         {
  71.             var content = new
  72.             {
  73.                 user = "嘻嘻2",
  74.                 post_date = "2021-10-11T15:00:12",
  75.                 message = "更新一下"
  76.             };
  77.             bool result = await _elasticSearchServer.UpdateDocumentByBulkAsync("users""1", content);
  78.             return result;
  79.         }
  80.         /// <summary>
  81.         /// 更新文档  
  82.         /// </summary>
  83.         /// <returns></returns>
  84.         public async Task<boolUpdateDocument()
  85.         {
  86.             var content = new
  87.             {
  88.                 user = "嘻嘻3",
  89.                 post_date = "2021-10-11T15:00:12",
  90.                 message = "更新一下333"
  91.             };
  92.             bool result = await _elasticSearchServer.UpdateDocumentAsync("users""1", content);
  93.             return result;
  94.         }
  95.         public async Task<boolSourceExistsAsync(string index = "users"string id = "1")
  96.         {
  97.             bool result = await _elasticSearchServer.SourceExistsAsync(index, id);
  98.             return result;
  99.         }
  100.         /// <summary>
  101.         /// 检测索引是否已经存在
  102.         /// </summary>
  103.         public async Task<boolIsIndexExsit(string index = "users")
  104.         {
  105.             bool result = await _elasticSearchServer.IsIndexExsit(index);
  106.             return result;
  107.         }
  108.         
  109.         /// <summary>
  110.         /// 创建index
  111.         /// </summary>
  112.         /// <param name="index"></param>
  113.         /// <returns></returns>
  114.         public async Task<boolCreateIndex(string index)
  115.         {
  116.             if (string.IsNullOrWhiteSpace(index))
  117.                 return false;
  118.             bool result = await _elasticSearchServer.CreateIndexAsync(index);
  119.             return result;
  120.         }
  121.         /// <summary>
  122.         /// 删除index
  123.         /// </summary>
  124.         /// <param name="index"></param>
  125.         /// <returns></returns>
  126.         public async Task<boolDeleteIndex(string index)
  127.         {
  128.             if (string.IsNullOrWhiteSpace(index))
  129.                 return false;
  130.             bool result = await _elasticSearchServer.DeleteIndexAsync(index);
  131.             return result;
  132.         }
  133.     }

部分效果如下:

其实调用方法的时候我们可以看到执行的原生语句是什么:


贴一下测试用的原生语句:

  1. ##添加内容
  2. PUT users/_create/2
  3. {
  4.      "user" : "xxx",
  5.     "post_date" : "2021-10-11T14:40:12",
  6.     "message" : "trying out Elasticsearch"
  7. }
  8. ##根据index和id查询文档
  9. GET users/_doc/1
  10. ##批量查询
  11. GET /_mget
  12. {
  13.     "docs" : [
  14.         {
  15.             "_index" : "users",
  16.             "_id" : "1"
  17.         },
  18.         {
  19.             "_index" : "users",
  20.             "_id" : "2"
  21.         },
  22.         {
  23.             "_index" : "users",
  24.             "_id" : "3"
  25.         }
  26.     ]
  27. }
  28. ##更新文档
  29. POST users/_update/1
  30. {
  31.      "doc" : {
  32.          "user" : "嘻嘻1"
  33.     }
  34. }
  35. ##检查index是否存在
  36. HEAD users


在贴一个代码下载地址:https://download.tnblog.net/resource/index/4407008a3846478c8eb0e33e48eff418


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

忘掉过去式

2021/7/15 9:34:43

流批,流批 大佬

默认昵称

2023/11/21 16:05:39

可惜代码不全啊

剑轩:@默认昵称嗯嗯,有点久没有怎么用这个了,当时封装可能没有怎么封装全

2023/11/21 16:51:47 回复

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...