.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
 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<string, string>();
 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<Result>(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 List<Dictionary<string, dynamic>> buckets { get; set; }
195             }
196             public class Hits {
197                 public int total { get; set; }
198                 public List<hit> 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 }
时间: 2024-10-22 17:12:14

.net ElasticSearch-Sql 扩展类的相关文章

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

UIManage单实例: 1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instan

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 &amp;&amp; Linux下的ZipArchive配置开启压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的

NSJSONSerialization(category)的一个扩展类

.h文件 // // NSJSONSerialization+Manage.h // SVPullToRefreshDemo // // Created by Fuer on 14-7-4. // Copyright (c) 2014年 Home. All rights reserved. // #import <Foundation/Foundation.h> /** * The domain for NSErrors generated by the NSJSONSerialization

HTML扩展类的所有方法都有2个参数:

——摘自Rocky Ren 以textbox为例子 public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, IDictionary<string, Object> htmlAttributes ) public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, Object h

一个简单的ORM制作(SQL帮助类)

一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若需要命名可修改为可变参数,IHelper代码如下: internal interface IHelper:IDisposable { int ExecuteQuery(string txt, IEnumerable<IDataParameter> ps, bool issp);//用于执行INSE

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs文件代码 如果这两地方的路径不一致则会导致上述错误出现 解决方法:将这两个地方的路径统一即可解决

Thinkphp编辑器扩展类kindeditor使用方法

一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp网站项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们复制到你的网站项目的ThinkPHP\Lib\ORG\Net 文件夹下. 2,editor文件夹是kindeditor的核心包.将其复制到你项目的Public文件夹下(和入口文件同级的那个Public),并在Public下再建立一个Upload文件夹,用于存放使用编辑器上传的图片. 3,KeditorAction.clas

基于Thinkphp3.2的qq第三方oauth认证登录扩展类

基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保存在/library/org/util/Qqconnect.class.php文件中在__construct方法中你可以直接写你的app_id.app_key和回调地址也可以根据自己的喜好,改一下代码传参或者写到配置文件.调用方法:1. 在qq的登录按钮的方法中调用getAuthCode方法例如:$

python学习:扩展类的方法

一:先看一段小程序 <span style="font-size:18px;"><strong>class person: def __init__(self): print "new person" self.name = "lyl" def setName(self,name): self.name = name def printName(self): print self.name p = person(); p.