TSql Output 用法
这是ElasticSearch 2.4 版本系列的第五篇:
- ElasticSearch入门 第一篇:Windows下安装ElasticSearch
- ElasticSearch入门 第二篇:集群配置
- ElasticSearch入门 第三篇:索引
- ElasticSearch入门 第四篇:使用C#添加和更新文档
- ElasticSearch入门 第五篇:使用C#查询文档
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
- ElasticSearch入门 第七篇:分析器
- ElasticSearch入门 第八篇:存储
- ElasticSearch入门 第九篇:实现正则表达式查询的思路
使用C#代码实现对ElastiSearch的编程查询,是十分方便的,通常情况下,开发者采用官方提供的NEST客户端程序,通过封装的方法向ElasticSearch引擎发送查询请求,搜索数据,最终获取返回的查询结果,实现预定的业务需求。在内部,NEST客户端通过格式化的数据结构,把C#代码转换成HTTP 请求(Request),减轻了用户直接编写Qeury DSL的麻烦。当然,用户也可以直接把Query DSL封装成HTTP请求,发送到ElasticSearch引擎;对开发者来说,不仅需要熟悉Query DSL的语法,而且需要手动编写代码,处理引擎返回的JSON结构化的数据集,采用这种方式的优点是不受限于NEST客户端程序,能够最大化使用ElasticSearch查询的各种参数,书写自由。
本文简单介绍使用C#代码对ElasticSearch进行编程查询的流程,具体的细节,请参考官方文档。
一,编程流程
1,创建客户端
在搜索文档之前,首先要连接到ElasticSearch引擎,创建客户端对象
- using Nest;
- var node = new Uri("http://myserver:9200");
- var settings = new ConnectionSettings(node).DefaultIndex("default");
- var client = new ElasticClient(settings);
2,创建查询请求
连接到引擎之后,创建搜索请求(SearchRequest),用于封装查询类型和查询条件
- SearchRequest sr = new SearchRequest("meetup", "events");
3,指定查询类型和查询条件
为搜索请求指定查询类型,可以是词条搜索,或全文搜索
- TermQuery tq = new TermQuery();
- tq.Field = "eventname";
- tq.Value = "azure";
- sr.Query = tq;
4,调整查询结果
为搜索请求设置参数,排序,分页,和选择返回的字段等,在选择查询结果返回的字段时,推荐在查询请求(SearchRequest)中使用Source Filter。
在查询请求中,通过类RequestSearch的数组字段StoredFileds,把已存储字段添加到该数组中,ElasticSearch引擎只返回特定的字段,而不是文档的所有字段。在索引映射中,已存储字段的store属性为true,StoredFileds数组只能选择已存储字段(stored field)。
- //windows
- sr.From = ;
- sr.Size = ;
- //sort
- ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
- sr.Sort = new List<ISort>();
- sr.Sort.Add(sort);
- //source filter
- sr.Source = new SourceFilter()
- {
- Includes = new string[] { "eventid", "eventname" },
- Excludes = new string[] { "roginalid", "description" }
- };
5,执行查询请求
最后,客户端执行搜索请求,获取搜索结果,并将查询结果中的文档集转换成列表
- var result = client.Search<MeetupEvents>(sr);
- return result.Documents.ToList<MeetupEvents>();
二,示例代码,使用Nest客户端搜索文档
在该示例代码中,本文简单列举词条查询,匹配查询,布尔查询和正则表达式查询的示例代码。
1,词条查询
- public List<MeetupEvents>GetResult_TermQuery( )
- {
- //create term query
- TermQuery tq = new TermQuery();
- tq.Field = "eventname";
- tq.Value = "azure";
- //create search request
- SearchRequest sr = new SearchRequest("meetup", "events");
- sr.Query = tq;
- //windows
- sr.From = ;
- sr.Size = ;
- //sort
- ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
- sr.Sort = new List<ISort>();
- sr.Sort.Add(sort);
- //source filter
- sr.Source = new SourceFilter()
- {
- Includes = new string[] { "eventid", "eventname" },
- Excludes = new string[] { "roginalid", "description" }
- };
- var result = client.Search<MeetupEvents>(sr);
- return result.Documents.ToList<MeetupEvents>();
- }
2,匹配查询
- public List<MeetupEvents> GetResult_MatchQuery()
- {
- SearchRequest sr = new SearchRequest("meetup", "events");
- MatchQuery mq = new MatchQuery();
- mq.Field = new Field("eventname");
- mq.Query = "azure cloud";
- mq.MinimumShouldMatch = ;
- mq.Operator = Operator.Or;
- sr.Query = mq;
- sr.From = ;
- sr.Size = ;
- sr.Sort = new List<ISort>();
- sr.Sort.Add(new SortField { Field = "eventid", Order = SortOrder.Ascending });
- ISearchResponse<MeetupEvents> result = client.Search<MeetupEvents>(sr);
- return result.Documents.ToList<MeetupEvents>();
- }
3,正则表达式查询
- public List<MeetupEvents>GetResult_RegexpQuery()
- {
- SearchRequest sr = new SearchRequest();
- RegexpQuery rq = new RegexpQuery();
- rq.Field = "description";
- rq.Value = "azu.*";
- rq.MaximumDeterminizedStates = ;
- sr.Query = rq;
- var result = client.Search<MeetupEvents>(sr);
- return result.Documents.ToList<MeetupEvents>();
- }
4,布尔查询
- public List<MeetupEvents>GetResult_BoolQuery()
- {
- SearchRequest sr = new SearchRequest("meetup", "events");
- BoolQuery bq = new BoolQuery();
- bq.Filter = new QueryContainer[]
- {
- new MatchQuery()
- {
- Field="eventname",
- Query="azure cloud",
- Operator=Operator.Or,
- MinimumShouldMatch=
- },
- new MatchQuery()
- {
- Field ="eventname",
- Query="aws google",
- Operator=Operator.Or,
- MinimumShouldMatch=
- }
- };
- bq.Should = new QueryContainer[]
- {
- new TermQuery()
- {
- Field="description",
- Value="azure"
- },
- new TermQuery()
- {
- Field="description",
- Value="cloud"
- }
- };
- bq.MinimumShouldMatch = ;
- sr.Query = bq;
- var result = client.Search<MeetupEvents>(sr);
- return result.Documents.ToList<MeetupEvents>();
- }
三,把Query DSL封装成HTTP Request
向ElasticSearch引擎发送Http请求,在http请求中指定查询的类型和查询条件,引擎在收到请求后执行搜索,查询结果以HTTP 响应(Response)返回,开发者需要从Response返回的JSON结构字符串中解析搜索结果。
1,封装类库
以下HTTP网络编程代码,是我们项目组一姐Amy的作品,谢谢Amy的分享,代码可以进一步封装,在此文中,仅仅作为演示:
- namespace ElasticSearchNet
- {
- class ESRequest
- {
- string es_host;
- string es_port;
- string es_index;
- string es_type;
- private string url;
- public ESRequest(string host,string index,string type,string port="")
- {
- es_host = host;
- es_port = port;
- es_index = index;
- es_type = type;
- string requst_cache = "request_cache=true";
- url = string.Format("http://{0}:{1}/{2}/{3}/_search?{4}", es_host, es_port, es_index, es_type,requst_cache);
- }
- public string ExecuteQeury(string json_query)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.ContentType = "aplication/json";
- request.Method = "POST";
- request.Timeout = * ;
- using (var sw = new StreamWriter(request.GetRequestStream()))
- {
- sw.Write(json_query);
- sw.Flush();
- sw.Close();
- }
- var response = (HttpWebResponse)request.GetResponse();
- using (var sr = new StreamReader(response.GetResponseStream()))
- {
- return sr.ReadToEnd();
- }
- }
- }
- }
2,执行查询
查询的结果是JSON结构的字符串,通常使用JObject和JToken类处理。
- ESRequest es = new ElasticSearchNet.ESRequest("cia-sh-svr-sis3", "meetup", "events");
- string json_query = @"
- { ""query"":{
- ""match"":{
- ""eventname"":""azure""
- }
- }
- }
- ";
- string strJsonResult=es.ExecuteQeury(json_query);
解析JSON的常用类库是:
参考文档:
Elasticsearch.Net and NEST: the .NET clients [5.x] » Search
Elasticsearch.Net and NEST: the .NET clients [5.x] » Query DSL
TSql Output 用法的更多相关文章
- 总结 output 用法
第一种用法 返回受 INSERT.UPDATE 或 DELETE 语句影响的每行的信息,或者返回基于上述每行的表达式.这些结果可以返回到处理应用程序, 以供在确认消息.存档以及其他类似的应用程序要求中 ...
- TSQL Merge 用法
在更新数据仓库时,经常需要根据源表对Target表进行数据同步,Merge 命令具有数据更新,删除,插入的功能,专门用于数据同步,并将数据的更新输出到表中.在使用Merge命令时,需要注意when n ...
- TSql Top 用法
第一部分:TSql Top 有两种用法 1,限制查询结果集返回的行数或总行数的百分比. 当将 TOP 与 ORDER BY 子句结合使用时,结果集限制为前 N 个已排序行:否则,以未定义的顺序返回前 ...
- TSQL HASHBYTES 用法
HashBytes 使用Hash 算法,能够产生高质量的Hash值,大幅度提高识别数据相异的准确性,但是HashBytes函数无法提供100%的准确度,如果业务逻辑要求不允许有误差,那么不要使用任何H ...
- sql server output用法说明
带有output的insert语句. @@identity只能返回当前会话最后生产的标识列. 如果一次性插入多条语句的话. 需要返回这些自动生产的标识列. 那么outpu就派上用场了. declar ...
- SQL语句中的output用法
private void button2_Click(object sender, RoutedEventArgs e) { using (SqlConnection conn = new SqlCo ...
- T-SQL:CTE用法(十)
CTE 也叫公用表表达式和派生表非常类似 先定义一个USACusts的CTE WITH USACusts AS ( SELECT custid, companyname FROM Sales.Cust ...
- 说一下output子句
Output子句日常灰常有用,而且用的地方也挺多,但是确好多时候被我们忽视,今天我就也简单扫盲一下这个语句的用法. Output子句 返回受 INSERT.UPDATE.DELETE 或 MERGE ...
- SQL Server特殊用法笔记
1. MERGE用法:关联两表,有则改,无则加 SQL语句: create table #AAA(id int,A int,AA int,AAA int,B int) create table #BB ...
随机推荐
- 黑马程序员-nil Nil NULL NSNull 野指针和空指针
空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...
- iscroll5 上拉,下拉 加载数据
我这里的思路是上拉时候只是加载第一页的内容,可根据实际情况修改其中的代码.请勿照搬.样式没怎么调,可以加载gif动画.1.没有数据时候,下拉可以加载数据.2.没有数据时候,点击也可以加载数据.3.其余 ...
- appframework build目录各文件之包含内容
{ "build/css/af.ui.css": [ "css/main.css", "css/appframework.css", &qu ...
- CSS盒模型
CSS盒模型是CSS 可视化格式化系统的基石,它是理解样式表如何工作的核心概念.盒模型用于元素定位和页面布局.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘 ...
- EJB概念理解
转自http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是"企 ...
- 如何利用word2013写图文并茂的博客
我有一天心血来潮,突然想写博客了,由于是技术贴,图文并茂,多图预警,可是在新浪博客,网易博客,博客园这些博客上写技术贴,似乎都不支持从已经写好的word文档里粘贴过去,于是各种百度各种尝试各种摸索 ...
- 在C#中简单调用FindWindow控制其他程序
C#本身是没有FindWindow这个函数的, 为什么没有呢? 很简单,C#毕竟是微软自家开发出来的.而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统 ...
- CSS中强大的EM
(转)作者:dearjohn ,发布于2012-7-31 http://www.uml.org.cn/html/201207311.asp 使用CSS也好久了,但一直都是在使用“px”来设置Web元素 ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- HTTP笔记整理(2)
四. http协议之请求 1.http请求由三部分组成,分别是:请求行(request line).请求报头(request header).请求正文(body) (1). 请求行:用来说明请求类 ...