.netElasticSearch-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: .netElasticSearch-Sql扩展类【原创】

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

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

(0)

大家都在看

  • 利用rabbitmq异步实现来提升程序处理性能

    近期交易系统出款交易量猛增,从skywalking监控平台查看服务的调用链路(Trace),发现在调用外部三方http接口会耗时将近一半。鉴于出款交易在业务上是异步处理的,所以,商…

    技术杂谈 2023年7月11日
    059
  • 解析京东cookie

    该脚本会自动解析剪贴板内的cookie内容,免去手动寻找pin和key的麻烦 Original: https://www.cnblogs.com/1314h/p/16745098….

    技术杂谈 2023年6月21日
    0125
  • 响应式编程的实践

    响应式编程在前端开发以及Android开发中有颇多运用,然而它的非阻塞异步编程模型以及对消息流的处理模式也在后端得到越来越多的应用。除了Netflix的OSS中大量使用了响应式编程…

    技术杂谈 2023年5月31日
    086
  • [学习笔记]Java运算符

    Java支持的运算符:算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其他运算符; 算术运算符 算术运算遵循四则运算法则,可以嵌套任意的括号。算术运算符用在数学表达式; …

    技术杂谈 2023年7月24日
    045
  • 做自动化测试选择Python还是Java?

    你好,我是测试蔡坨坨。 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件…

    技术杂谈 2023年7月11日
    068
  • 高保真胆机制作详解 学习笔记[1]

    胆机: 一 电源篇 二 功放篇 前级(电压放大)+后级(功率放大) 2.1 前级 2.1.1 前级放大电路组成 – 2.1.2 电子管选择 2.1.3 相关参数 2.1…

    技术杂谈 2023年5月31日
    0112
  • 华为云数据治理生产线DataArts,让“数据‘慧’说话”

    摘要:数据治理生产线DataArts改变了传统”人拉肩抗”的数据处理方式,帮助提升效率;降低技术门槛,让”人人都是分析师”;让&#8…

    技术杂谈 2023年5月31日
    0100
  • codeforces 13EE. Holes(分块&amp;动态树)

    题意: 给你n个编号1到N的洞(N 1.0 a b。把a号洞的po改成b 思路: 假设题目没有改动操作。这题就会非常easy。 我们仅仅须要把每一个洞的出界点和弹跳数预处理出来就能…

    技术杂谈 2023年5月31日
    083
  • JBoss4.2.2配置及优化

    本文是在[url=http://solarisxb.cublog.cn]SOLARIS小兵[/url]的[url=http://blog.chinaunix.net/u/504/s…

    技术杂谈 2023年5月30日
    066
  • FineUIPro/Mvc/Core v7.1.1 正式发布了!

    注:本版本会于 2021-6-28 准时更新到社区 。 FineUIPro/Mvc/Core v7.1.1 正式发布了,这个版本主要是BUG修正,建议所有用户升级到此版本! 下面先…

    技术杂谈 2023年6月1日
    071
  • 负负得正

    有了《系统架构的11条原则》,真正到设计阶段还有另外11个考虑。 系统正确性 考虑一:负负得正 假如我们看到某个代码,明显有逻辑错误,想随手改改。你就要考虑一件事情:这段明显有问题…

    技术杂谈 2023年5月31日
    0101
  • 深入剖析Sgementationfault原理

    深入剖析Sgementation fault原理 前言 我们在日常的编程当中,我们很容易遇到的一个程序崩溃的错误就是 segmentation fault,在本篇文章当中将主要分析…

    技术杂谈 2023年7月23日
    091
  • 技术管理进阶——如何在面试中考察候选人并增大入职概率

    原创不易,求分享、求一键三连 前段时间有个粉丝抱怨了一个问题: 小钗,我最近面试遇到个非常不尊重人的面试官,全程咄咄逼人,语气轻蔑,可把我气坏了! 虽然面试就是评价候选人,但并不意…

    技术杂谈 2023年6月1日
    082
  • 4.如何避免缓存穿透、缓存击穿、缓存雪崩

    先来看一下缓存穿透,是指业务请求穿过了缓存层,落到持久化存储上。在大多数场景下,我们应用缓存是为了承载前端业务请求,缓存被击穿以后,如果请求量比较大,则会导致数据库出现风险。 以双…

    技术杂谈 2023年7月24日
    070
  • [学习笔记]Java正则表达式

    正则表达式 正则表达式定义了字符串的模式,可以用于搜索、编辑或处理文本; 正则表达式使用字符串描述规则,并用于匹配字符串; 一个正则表达式其实就是一个描述规则的字符串,被正则表达式…

    技术杂谈 2023年7月24日
    049
  • Gitlab 403 forbidden 并发引起IP被封

    问题 在工作中自搭建的Gitlab。但今天打开页面的时候显示的是空白页面,上面还有一次文本Forbidden。 原因 Gitlab使用rack_attack做了并发访问的限制。 解…

    技术杂谈 2023年7月11日
    051
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球