这是ElasticSearch 2.4 版本系列的第五篇:

使用C#代码实现对ElastiSearch的编程查询,是十分方便的,通常情况下,开发者采用官方提供的NEST客户端程序,通过封装的方法向ElasticSearch引擎发送查询请求,搜索数据,最终获取返回的查询结果,实现预定的业务需求。在内部,NEST客户端通过格式化的数据结构,把C#代码转换成HTTP 请求(Request),减轻了用户直接编写Qeury DSL的麻烦。当然,用户也可以直接把Query DSL封装成HTTP请求,发送到ElasticSearch引擎;对开发者来说,不仅需要熟悉Query DSL的语法,而且需要手动编写代码,处理引擎返回的JSON结构化的数据集,采用这种方式的优点是不受限于NEST客户端程序,能够最大化使用ElasticSearch查询的各种参数,书写自由。

本文简单介绍使用C#代码对ElasticSearch进行编程查询的流程,具体的细节,请参考官方文档。

一,编程流程

1,创建客户端

在搜索文档之前,首先要连接到ElasticSearch引擎,创建客户端对象

  1. using Nest;
  2. var node = new Uri("http://myserver:9200");
  3. var settings = new ConnectionSettings(node).DefaultIndex("default");
  4. var client = new ElasticClient(settings);

2,创建查询请求

连接到引擎之后,创建搜索请求(SearchRequest),用于封装查询类型和查询条件

  1. SearchRequest sr = new SearchRequest("meetup", "events");

3,指定查询类型和查询条件

为搜索请求指定查询类型,可以是词条搜索,或全文搜索

  1. TermQuery tq = new TermQuery();
  2. tq.Field = "eventname";
  3. tq.Value = "azure";
  4. sr.Query = tq;

4,调整查询结果

为搜索请求设置参数,排序,分页,和选择返回的字段等,在选择查询结果返回的字段时,推荐在查询请求(SearchRequest)中使用Source Filter。

在查询请求中,通过类RequestSearch的数组字段StoredFileds,把已存储字段添加到该数组中,ElasticSearch引擎只返回特定的字段,而不是文档的所有字段。在索引映射中,已存储字段的store属性为true,StoredFileds数组只能选择已存储字段(stored field)。

  1. //windows
  2. sr.From = ;
  3. sr.Size = ;
  4.  
  5. //sort
  6. ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
  7. sr.Sort = new List<ISort>();
  8. sr.Sort.Add(sort);
  9.  
  10. //source filter
  11. sr.Source = new SourceFilter()
  12. {
  13. Includes = new string[] { "eventid", "eventname" },
  14. Excludes = new string[] { "roginalid", "description" }
  15. };

5,执行查询请求

最后,客户端执行搜索请求,获取搜索结果,并将查询结果中的文档集转换成列表

  1. var result = client.Search<MeetupEvents>(sr);
  2. return result.Documents.ToList<MeetupEvents>();

二,示例代码,使用Nest客户端搜索文档

在该示例代码中,本文简单列举词条查询,匹配查询,布尔查询和正则表达式查询的示例代码。

1,词条查询

  1. public List<MeetupEvents>GetResult_TermQuery( )
  2. {
  3. //create term query
  4. TermQuery tq = new TermQuery();
  5. tq.Field = "eventname";
  6. tq.Value = "azure";
  7.  
  8. //create search request
  9. SearchRequest sr = new SearchRequest("meetup", "events");
  10. sr.Query = tq;
  11.  
  12. //windows
  13. sr.From = ;
  14. sr.Size = ;
  15.  
  16. //sort
  17. ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
  18. sr.Sort = new List<ISort>();
  19. sr.Sort.Add(sort);
  20.  
  21. //source filter
  22. sr.Source = new SourceFilter()
  23. {
  24. Includes = new string[] { "eventid", "eventname" },
  25. Excludes = new string[] { "roginalid", "description" }
  26. };
  27.  
  28. var result = client.Search<MeetupEvents>(sr);
  29. return result.Documents.ToList<MeetupEvents>();
  30. }

2,匹配查询

  1. public List<MeetupEvents> GetResult_MatchQuery()
  2. {
  3. SearchRequest sr = new SearchRequest("meetup", "events");
  4. MatchQuery mq = new MatchQuery();
  5. mq.Field = new Field("eventname");
  6. mq.Query = "azure cloud";
  7. mq.MinimumShouldMatch = ;
  8. mq.Operator = Operator.Or;
  9.  
  10. sr.Query = mq;
  11. sr.From = ;
  12. sr.Size = ;
  13. sr.Sort = new List<ISort>();
  14. sr.Sort.Add(new SortField { Field = "eventid", Order = SortOrder.Ascending });
  15.  
  16. ISearchResponse<MeetupEvents> result = client.Search<MeetupEvents>(sr);
  17.  
  18. return result.Documents.ToList<MeetupEvents>();
  19. }

3,正则表达式查询

  1. public List<MeetupEvents>GetResult_RegexpQuery()
  2. {
  3. SearchRequest sr = new SearchRequest();
  4.  
  5. RegexpQuery rq = new RegexpQuery();
  6. rq.Field = "description";
  7. rq.Value = "azu.*";
  8. rq.MaximumDeterminizedStates = ;
  9.  
  10. sr.Query = rq;
  11.  
  12. var result = client.Search<MeetupEvents>(sr);
  13. return result.Documents.ToList<MeetupEvents>();
  14. }

4,布尔查询

  1. public List<MeetupEvents>GetResult_BoolQuery()
  2. {
  3. SearchRequest sr = new SearchRequest("meetup", "events");
  4.  
  5. BoolQuery bq = new BoolQuery();
  6. bq.Filter = new QueryContainer[]
  7. {
  8. new MatchQuery()
  9. {
  10. Field="eventname",
  11. Query="azure cloud",
  12. Operator=Operator.Or,
  13. MinimumShouldMatch=
  14. },
  15. new MatchQuery()
  16. {
  17. Field ="eventname",
  18. Query="aws google",
  19. Operator=Operator.Or,
  20. MinimumShouldMatch=
  21. }
  22. };
  23. bq.Should = new QueryContainer[]
  24. {
  25. new TermQuery()
  26. {
  27. Field="description",
  28. Value="azure"
  29. },
  30. new TermQuery()
  31. {
  32. Field="description",
  33. Value="cloud"
  34. }
  35.  
  36. };
  37. bq.MinimumShouldMatch = ;
  38.  
  39. sr.Query = bq;
  40.  
  41. var result = client.Search<MeetupEvents>(sr);
  42. return result.Documents.ToList<MeetupEvents>();
  43. }

三,把Query DSL封装成HTTP Request

向ElasticSearch引擎发送Http请求,在http请求中指定查询的类型和查询条件,引擎在收到请求后执行搜索,查询结果以HTTP 响应(Response)返回,开发者需要从Response返回的JSON结构字符串中解析搜索结果。

1,封装类库

以下HTTP网络编程代码,是我们项目组一姐Amy的作品,谢谢Amy的分享,代码可以进一步封装,在此文中,仅仅作为演示:

  1. namespace ElasticSearchNet
  2. {
  3. class ESRequest
  4. {
  5. string es_host;
  6. string es_port;
  7. string es_index;
  8. string es_type;
  9. private string url;
  10.  
  11. public ESRequest(string host,string index,string type,string port="")
  12. {
  13. es_host = host;
  14. es_port = port;
  15. es_index = index;
  16. es_type = type;
  17.  
  18. string requst_cache = "request_cache=true";
  19. url = string.Format("http://{0}:{1}/{2}/{3}/_search?{4}", es_host, es_port, es_index, es_type,requst_cache);
  20. }
  21.  
  22. public string ExecuteQeury(string json_query)
  23. {
  24. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  25. request.ContentType = "aplication/json";
  26. request.Method = "POST";
  27. request.Timeout = * ;
  28. using (var sw = new StreamWriter(request.GetRequestStream()))
  29. {
  30. sw.Write(json_query);
  31. sw.Flush();
  32. sw.Close();
  33. }
  34.  
  35. var response = (HttpWebResponse)request.GetResponse();
  36. using (var sr = new StreamReader(response.GetResponseStream()))
  37. {
  38. return sr.ReadToEnd();
  39. }
  40. }
  41. }
  42. }

2,执行查询

查询的结果是JSON结构的字符串,通常使用JObject和JToken类处理。

  1. ESRequest es = new ElasticSearchNet.ESRequest("cia-sh-svr-sis3", "meetup", "events");
  2. string json_query = @"
  3. { ""query"":{
  4. ""match"":{
  5. ""eventname"":""azure""
  6. }
  7. }
  8. }
  9. ";
  10. 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 用法的更多相关文章

  1. 总结 output 用法

    第一种用法 返回受 INSERT.UPDATE 或 DELETE 语句影响的每行的信息,或者返回基于上述每行的表达式.这些结果可以返回到处理应用程序, 以供在确认消息.存档以及其他类似的应用程序要求中 ...

  2. TSQL Merge 用法

    在更新数据仓库时,经常需要根据源表对Target表进行数据同步,Merge 命令具有数据更新,删除,插入的功能,专门用于数据同步,并将数据的更新输出到表中.在使用Merge命令时,需要注意when n ...

  3. TSql Top 用法

    第一部分:TSql Top 有两种用法 1,限制查询结果集返回的行数或总行数的百分比. 当将 TOP 与 ORDER BY 子句结合使用时,结果集限制为前 N 个已排序行:否则,以未定义的顺序返回前 ...

  4. TSQL HASHBYTES 用法

    HashBytes 使用Hash 算法,能够产生高质量的Hash值,大幅度提高识别数据相异的准确性,但是HashBytes函数无法提供100%的准确度,如果业务逻辑要求不允许有误差,那么不要使用任何H ...

  5. sql server output用法说明

    带有output的insert语句. @@identity只能返回当前会话最后生产的标识列.  如果一次性插入多条语句的话. 需要返回这些自动生产的标识列. 那么outpu就派上用场了. declar ...

  6. SQL语句中的output用法

    private void button2_Click(object sender, RoutedEventArgs e) { using (SqlConnection conn = new SqlCo ...

  7. T-SQL:CTE用法(十)

    CTE 也叫公用表表达式和派生表非常类似 先定义一个USACusts的CTE WITH USACusts AS ( SELECT custid, companyname FROM Sales.Cust ...

  8. 说一下output子句

    Output子句日常灰常有用,而且用的地方也挺多,但是确好多时候被我们忽视,今天我就也简单扫盲一下这个语句的用法. Output子句 返回受 INSERT.UPDATE.DELETE 或 MERGE ...

  9. SQL Server特殊用法笔记

    1. MERGE用法:关联两表,有则改,无则加 SQL语句: create table #AAA(id int,A int,AA int,AAA int,B int) create table #BB ...

随机推荐

  1. 黑马程序员-nil Nil NULL NSNull 野指针和空指针

    空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...

  2. iscroll5 上拉,下拉 加载数据

    我这里的思路是上拉时候只是加载第一页的内容,可根据实际情况修改其中的代码.请勿照搬.样式没怎么调,可以加载gif动画.1.没有数据时候,下拉可以加载数据.2.没有数据时候,点击也可以加载数据.3.其余 ...

  3. appframework build目录各文件之包含内容

    { "build/css/af.ui.css": [ "css/main.css", "css/appframework.css", &qu ...

  4. CSS盒模型

    CSS盒模型是CSS 可视化格式化系统的基石,它是理解样式表如何工作的核心概念.盒模型用于元素定位和页面布局.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘 ...

  5. EJB概念理解

    转自http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是"企 ...

  6. 如何利用word2013写图文并茂的博客

      我有一天心血来潮,突然想写博客了,由于是技术贴,图文并茂,多图预警,可是在新浪博客,网易博客,博客园这些博客上写技术贴,似乎都不支持从已经写好的word文档里粘贴过去,于是各种百度各种尝试各种摸索 ...

  7. 在C#中简单调用FindWindow控制其他程序

    C#本身是没有FindWindow这个函数的, 为什么没有呢? 很简单,C#毕竟是微软自家开发出来的.而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统 ...

  8. CSS中强大的EM

    (转)作者:dearjohn ,发布于2012-7-31 http://www.uml.org.cn/html/201207311.asp 使用CSS也好久了,但一直都是在使用“px”来设置Web元素 ...

  9. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

  10. HTTP笔记整理(2)

    四.  http协议之请求 1.http请求由三部分组成,分别是:请求行(request line).请求报头(request header).请求正文(body) (1).  请求行:用来说明请求类 ...