.net ElasticSearch-Sql 扩展类【原创】

官方提供的是java sdk,并支持jdbc方式的查询结果输出;但是却没有.net sdk的支持。

开发 ElasticSearch-Sql 第三方开源项目的.net sdk,未来集成入bsf框架。(已使用,但未进行大范围使用测试,欢迎交流并抛砖引玉)

参考ElasticSearch-Sql 开源地址:https://github.com/NLPchina/elasticsearch-sql

1)支持将查询结果转换成datatable形式,便于界面绑定和数据导出等。

2)代码简单易懂,便于改进并提高稳定性和性能。(拷贝立即使用)

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data;
  4 using System.Linq;
  5 using System.Net.Http;
  6 using System.Net.Http.Headers;
  7 using System.Reflection;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 /*by 车江毅 欢迎交流,一起完善之。.net 开源,因你更美好*/
 11 namespace BSF.ElasticSearch
 12 {
 13     public class EsSqlProvider
 14     {
 15         private string url;
 16         private HttpClient client = new HttpClient();
 17         public EsSqlProvider(string ip,int port)
 18         {
 19             this.url = string.Format("http://{0}:{1}/_sql",ip,port);
 20         }
 21
 22         public EsSqlProvider(string url)
 23         {
 24             this.url = url.TrimEnd('/')+"/_sql";
 25         }
 26
 27         public Result Post(string sql)
 28         {
 29             //var http = new BSF.Api.HttpProvider();
 30             //var dic = new Dictionary();
,> 31             //dic.Add("",sql);
 32
 33             var content = new StringContent(sql);
 34             content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
 35             var json = PostBase(content);
 36
 37             return new BSF.Serialization.JsonProvider().Deserialize(json);
 38
 39         }
 40
 41         public DataTable Query(string sql)
 42         {
 43             var result = Post(sql);
 44             if (result.aggregations != null && result.aggregations.Count > 0)
 45             {
 46                 var first = result.aggregations.First();
 47                 //groupby 统计方式
 48                 if (first.Value != null && first.Value.buckets != null && first.Value.buckets.Count > 0)
 49                 {
 50                     DataTable dataTable = new DataTable("es-groupby");
 51                     //以第一列为准,填充列
 52                     {
 53                         var t = first.Value.buckets[0];
 54                         dataTable.Columns.Add(new DataColumn(first.Key, ColumnType((GetValue((object)t["key"])).GetType())));
 55                         foreach (var c in t)
 56                         {
 57                             if (c.Key != "doc_count"&&c.Key!= "key")
 58                             { dataTable.Columns.Add(new DataColumn(c.Key, (GetValue(c.Value)).GetType())); }
 59                         }
 60                     }
 61                     //填充值
 62                     foreach (var b in first.Value.buckets)
 63                     {
 64                         DataRow dataRow = dataTable.NewRow();
 65                         dataRow[first.Key] = b["key"];
 66                         foreach (var c in b)
 67                         {
 68                             if(dataTable.Columns.Contains(c.Key))
 69                                 dataRow[c.Key] = GetValue(c.Value);
 70                         }
 71                         dataTable.Rows.Add(dataRow);
 72                     }
 73                     return dataTable;
 74
 75                 }
 76                 else if (first.Value != null&& first.Value.value!=null)
 77                 {
 78                     DataTable dataTable = new DataTable("es-aggregations");
 79                     //常规统计方式
 80                     foreach (var o in result.aggregations)
 81                     {
 82                         dataTable.Columns.Add(new DataColumn(o.Key, ColumnType((GetValue((object)o.Value)).GetType())));
 83                     }
 84                     DataRow dataRow = dataTable.NewRow();
 85                     foreach (var o in result.aggregations)
 86                     {
 87                         if (dataTable.Columns.Contains(o.Key))
 88                             dataRow[o.Key] = GetValue(o.Value);
 89                     }
 90                     dataTable.Rows.Add(dataRow);
 91                     return dataTable;
 92                 }
 93             }
 94             else if (result.sources != null && result.sources.Count > 0)
 95             {
 96                 DataTable dataTable = new DataTable("es-sources");
 97                 var first = result.sources.First();
 98                 foreach (var item in ((Dictionary<string,dynamic>)first))
 99                 {
100                     dataTable.Columns.Add(new DataColumn(item.Key, ColumnType((GetValue((Object)item.Value)).GetType())));
101                 }
102                 foreach (dynamic m in result.sources)
103                 {
104                     DataRow dataRow = dataTable.NewRow();
105                     foreach (var item in ((Dictionary<string, dynamic>)m))
106                     {
107                         if (dataTable.Columns.Contains(item.Key))
108                             dataRow[item.Key] = GetValue(item.Value);
109                     }
110                     dataTable.Rows.Add(dataRow);
111                 }
112                 return dataTable;
113             }
114             return null;
115         }
116
117         private Type ColumnType(Type type)
118         {
119             if (type.IsArray)
120             {
121                 return typeof(string);
122             }
123             else
124                 return type;
125         }
126
127
128         private Object GetValue(Object value)
129         {
130             if (value != null && value is Array)
131                 return new BSF.Serialization.JsonProvider().Serializer(value);
132             if (value != null && (value.GetType().IsValueType || value is String))
133                 return value;
134             if (value != null && value is Dictionary<string, dynamic>)
135             {
136                 var valuet = (Dictionary<string, dynamic>)value;
137                 if( valuet.ContainsKey("value_as_string"))
138                     return GetValue(valuet["value_as_string"]);
139                 if (valuet.ContainsKey("value"))
140                     return GetValue(valuet["value"]);
141             }
142             if (value != null && value.GetType().GetProperty("value")!=null)
143             {
144                 var p= value.GetType().GetProperty("value_as_string");
145                 if (p!=null&&p.GetValue(value)!=null)
146                     return p.GetValue(value);
147                 p = value.GetType().GetProperty("value");
148                 if (p != null && p.GetValue(value) != null)
149                     return p.GetValue(value);
150             }
151             return new BSF.Serialization.JsonProvider().Serializer(value);
152         }
153
154         private Object GetPropertyValue(Object obj, string property)
155         {
156             var p = obj.GetType().GetProperty(property);
157             if (p != null)
158                 return p.GetValue(obj);
159             return null;
160         }
161
162         private string PostBase(HttpContent content)
163         {
164             //此处未来需要添加HttpClient连接池,复用连接
165             //using (var client = new HttpClient())
166             //{
167             var result = client.PostAsync(url, content).Result;
168             string resultContent = result.Content.ReadAsStringAsync().Result;
169             return resultContent;
170             //}
171         }
172
173         public class Result{
174
175             public Hits hits { get; set; }
176             public Dictionary<string, aggregation> aggregations {get;set;}
177
178             public List<dynamic> sources { get {
179                     List<dynamic> rs = new List<dynamic>();
180                     foreach (var h in hits.hits)
181                     {
182                         rs.Add(h._source);
183                     }
184                     return rs;
185                 } }
186
187             public class aggvalue
188             {
189                 public dynamic value { get; set; }
190                 public string value_as_string { get; set; }
191             }
192             public class aggregation: aggvalue
193             {
194                 public Liststring, dynamic>> buckets { get; set; }
195             }
196             public class Hits {
197                 public int total { get; set; }
198                 public List hits { get; set; }
199             }
200             public class hit {
201                 public string _index { get; set; }
202                 public string _type { get; set; }
203                 public string _id { get; set; }
204
205                 public string _score { get; set; }
206
207                 public dynamic _source { get; set; }
208             }
209
210         }
211     }
212 }

欢迎交流,为了更好的完善之, 开源QQ群: .net 开源基础服务 238543768

by 车江毅

Original: https://www.cnblogs.com/chejiangyi/p/7217153.html
Author: 车江毅
Title: .net ElasticSearch-Sql 扩展类【原创】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589158/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 理解Java BlockingQueue

    数据结构与算法是天生一对。 BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用。 BlockingQueue实现的功能如下: 当队列为空时,往队列中读…

    Java 2023年5月29日
    069
  • 从零开始实现放置游戏(六)——实现后台管理系统(4)Excel批量导入

    前面我们已经实现了在后台管理系统中,对配置数据的增删查改。但每次添加只能添加一条数据,实际生产中,大量数据通过手工一条一条添加不太现实。本章我们就实现通过Excel导入配置数据的功…

    Java 2023年6月5日
    093
  • 链表反转类算法题

    反转链表类 NO1. 反转链表 给定一个长度为 n 的链表,反转该链表,输出表头。 方法一:迭代法(推荐使用) 算法流程: step 1 :特殊情况判断,空链表或只有一个结点的链表…

    Java 2023年6月15日
    077
  • Java 重载

    java允许一个类中含有多个同名方法,但要求各个同名方法的形参数量或类型或顺序不一致。 调用方法时按照传入的实参调用对应的方法,这就叫重载。 如果同名方法且形参一致,那就不叫重载了…

    Java 2023年6月5日
    066
  • 20220728-Object类常用方法

    Object类中常用方法 equals方法 1. ==的使用 2. equals方法的使用 hashcode方法 toString方法 finalize方法 学习来源:《韩顺平零基…

    Java 2023年6月15日
    070
  • Day16

    package com.oop.demo10;public class Outer { private int id=10; public void out(){ System.o…

    Java 2023年6月5日
    089
  • java_异常机制(二)

    1.异常对象处理完之后会怎样: 异常处理对象在异常处理完后,没有引用指向它,变成了不可达对象,Exception对象会在下一个垃圾回收过程中被回收掉。 它将在接下来JVM进行gc操…

    Java 2023年6月5日
    072
  • OpenSSL的升级

    参考链接,复制过来的知乎一个博主的,可能知乎对链接做了些限制,导致不好复制,这里也正好再复习一遍:https://zhuanlan.zhihu.com/p/133999805?fr…

    Java 2023年6月6日
    062
  • Spring Data Jpa

    &#x3000;&#x3000;JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(J…

    Java 2023年6月8日
    0104
  • Hyper-V无法启动虚拟机因为虚拟机监控程序未运行

    Hyper-v无法启动虚拟机,因为虚拟机管理程序未运行 解决问题的大致思路 在任务管理器中查看cpu虚拟化是否开启虚拟化。 如果没有开启 重新启动电脑进入bios中找到Intel …

    Java 2023年5月30日
    0315
  • 【转载】JAVA基础:注解

    一、认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的…

    Java 2023年5月29日
    094
  • Vue 消除Token过期时刷新页面的重复提示

    1、问题现象 页面长时间未操作,再刷新页面时,第一次弹出”token失效,请重新登录!”提示,然后跳转到登录页面,接下来又弹出了n个”Token…

    Java 2023年6月14日
    084
  • Nginx反向代理WebSocket

    bash;gutter:true; http {</p> <pre><code>upstream websocket { server 192….

    Java 2023年5月30日
    075
  • Redmi AC2100 路由器 官方固件允许IPv6外网访问下游设备

    开启SSH权限。F12打开浏览器的开发者模式,并切换至终端选项卡,复制以下代码至终端处,并敲回车执行: function getSTOK() { let match = locat…

    Java 2023年6月7日
    079
  • Excel合并多个Excel工作簿

    选择新增列,自定义列,输入列公式:=Excel.Workbook([Content])(区分大小写),选择content Original: https://www.cnblogs…

    Java 2023年6月16日
    088
  • spring框架技术方面

    一:描述spring事务的只读,超时,回滚的原则。1.spring事务的只读:“只读事务”并不是一个强制选项,它只是一个暗示,提示数据库驱动程序和数据库系统…

    Java 2023年6月5日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球