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 ...
随机推荐
- 《转》python线程池
线程池的概念是什么? 在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象 ...
- Android中 int 和 String 互相转换的多种方法
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- FMDB读取Datetime类型值为1970的问题
1.问题 今天使用FMDB做一个例子程序,新建的一张表有一个datetime字段,数据库有默认值,大概如下 CREATE TABLE [ConsumptionType] ([id] INTEGER P ...
- HDU 1051 Wooden Sticks
题意: 有 n 根木棒,长度和质量都已经知道,需要一个机器一根一根地处理这些木棒. 该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模板的. 机器需要的准备时间如下: 1.第一根需要1 ...
- Yii2 性能优化 来源yii2官方文档
优化你的 PHP 环境 使用最新稳定版本的 PHP . PHP 的主要版本可能带来显著的性能提升. 启用字节码缓存 Opcache(PHP 5.5或更高版本) 或 APC (PHP 5.4或更早版本) ...
- pivotx的entry和page内容里的日期格式修改
欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=63 1. 文章发布时间的确定 如果服务器空间在国内还好说, 如果在国外的话, 文章编辑时 ...
- crtmpserver系列(一):流媒体概述
概述 所谓流媒体按照字面意思理解就是像流一样的媒体,看起来像是废话.流媒体现在司空见惯,所以一般人大概不会有疑问.事实上在流媒体还没有出现的时候,基本上通过网络播放电影就不太现实.通过网络播放电影的时 ...
- SqlServer2012 数据库的同步之发布+订阅
文章参考了百度过的文章,因为版本不同,操作中也遇到了很多问题,现在整理一下,希望对各位朋友有所帮助. 发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在 ...
- [Asp.net 开发系列之SignalR篇]专题六:使用SignalR实现消息提醒
一.引言 前面一篇文章我介绍了如何使用SignalR实现图片的传输,然后对于即时通讯应用来说,消息提醒是必不可少的.现在很多网站的都有新消息的提醒功能.自然对于SignalR系列也少不了这个功能的实现 ...
- AlwaysOn 同步时间的测试
背景 <SQL Server 2012实施与管理实战指南>中指AlwaysON同步过程如下: 任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个 ...