.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 2023年6月16日
    082
  • Spring-cloud-alibaba-nacos(配置中心-多配置文件配置)快速入门(三)

    上一篇按照环境隔离了命名空间和开发组,这篇就按照服务来划分一下 1、多配置文件 配置bootstrap.yaml spring: cloud: nacos: config: ser…

    Java 2023年6月5日
    0100
  • Spring-Cloud-Ribbon学习笔记(二):自定义负载均衡规则

    Ribbon自定义负载均衡策略有两种方式,一是JavaConfig,一是通过配置文件(yml或properties文件)。 需求 假设我有包含A和B服务在内的多个微服务,它们均注册…

    Java 2023年5月30日
    087
  • 通过源码了解Java的自动装箱拆箱

    什么叫装箱 & 拆箱? 将int基本类型转换为Integer包装类型的过程叫做装箱,反之叫拆箱。 首先看一段代码 public static void main(Strin…

    Java 2023年6月5日
    074
  • Git 使用入门

    学习之前,要明白一个概念: 版本控制 什么是版本控制 版本迭代,新的版本,需要版本管理器 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或…

    Java 2023年6月9日
    071
  • zookeeper篇-watch命令

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 每个路径节点都有一个watcher监控,当该节点数…

    Java 2023年6月8日
    092
  • ExceptionHandler配合RestControllerAdvice全局处理异常

    Java全局处理异常 引言 对于controller中的代码,为了保证其稳定性,我们总会对每一个controller中的代码进行try-catch,但是由于接口太多,try-cat…

    Java 2023年6月8日
    084
  • 分布式session的解决方法

    一、背景 上篇博客,使用微博社交登录谷粒商城后,将用户信息保存在session中,此时进入到谷粒商城的任何页面都需要能够取到用户信息, 谷粒商城首页(gulimall.com/in…

    Java 2023年5月30日
    075
  • 解决SpringBoot jar包中的文件读取问题

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档、导出模版等),本地开发时可以正常…

    Java 2023年6月14日
    075
  • Canal高可用架构部署

    一、前言 canal 是阿里的一款开源项目,纯 Java 开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了 MySQL(也支持 mariaDB)。 ca…

    Java 2023年6月6日
    078
  • map删除key报错java.util.ConcurrentModificationException

    遍历map判断value值是否为空,为空则删除此key原始方法 for (String key: map.keySet()){ if (CollectionUtils.isEmpt…

    Java 2023年6月14日
    068
  • ssm中获取request

    ServletRequestAttributes 和 RequestContextHolder 使用ssm自带类进行获取request ServletRequestAttribut…

    Java 2023年6月9日
    083
  • HashMap中红黑树插入节点的调整过程

    一、引言 二、HashMap源码中红黑树插入节点的调整过程 三、阅读HashMap源码的一些Tips 1. 代码风格 2. 变量名 balanceInsertion方法中的变量名 …

    Java 2023年6月6日
    078
  • android解决W/System.err: retrofit2.adapter.rxjava3.HttpException: HTTP 400 Bad Request 错误

    接口请求中加header有时400报错,请求失败 查看信息应该是header传值有问题,语法格式有误,可能是header中有特殊字符为编码,服务器无法理解此请求。尝试fix,将he…

    Java 2023年5月29日
    092
  • Spring Security + JWT 实现一个权限系统,写的太好了吧!

    作者:小小____来源:segmentfault.com/a/1190000023052493 思维导图如下 RBAC权限分析 RBAC 全称为基于角色的权限控制,本段将会从什么是…

    Java 2023年6月15日
    057
  • DBExplorer使用和修改整理

    2 DBExplorer介绍 DBExplorer是一个B/S架构的Web程序,基于JDBC连接数据库服务。它采用Extjs构建GUI,因此也具有和C/S程序一样良好的使用体验。 …

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