ElasticSearch入门 第五篇:使用C#查询文档

秒速五厘米 2023-06-01 03:26 23阅读 0赞

ElasticSearch入门 第五篇:使用C#查询文档

这是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引擎,创建客户端对象

  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 = 0;
  3. sr.Size = 100;
  4. //sort
  5. ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
  6. sr.Sort = new List<ISort>();
  7. sr.Sort.Add(sort);
  8. //source filter
  9. sr.Source = new SourceFilter()
  10. {
  11. Includes = new string[] { "eventid", "eventname" },
  12. Excludes = new string[] { "roginalid", "description" }
  13. };

复制代码

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. //create search request
  8. SearchRequest sr = new SearchRequest("meetup", "events");
  9. sr.Query = tq;
  10. //windows
  11. sr.From = 0;
  12. sr.Size = 100;
  13. //sort
  14. ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
  15. sr.Sort = new List<ISort>();
  16. sr.Sort.Add(sort);
  17. //source filter
  18. sr.Source = new SourceFilter()
  19. {
  20. Includes = new string[] { "eventid", "eventname" },
  21. Excludes = new string[] { "roginalid", "description" }
  22. };
  23. var result = client.Search<MeetupEvents>(sr);
  24. return result.Documents.ToList<MeetupEvents>();
  25. }

复制代码

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 = 2;
  8. mq.Operator = Operator.Or;
  9. sr.Query = mq;
  10. sr.From = 0;
  11. sr.Size = 100;
  12. sr.Sort = new List<ISort>();
  13. sr.Sort.Add(new SortField { Field = "eventid", Order = SortOrder.Ascending });
  14. ISearchResponse<MeetupEvents> result = client.Search<MeetupEvents>(sr);
  15. return result.Documents.ToList<MeetupEvents>();
  16. }

复制代码

3,正则表达式查询

复制代码

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

复制代码

4,布尔查询

复制代码

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

复制代码

三,把Query DSL封装成HTTP Request

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

1,封装类库

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

ExpandedBlockStart.gif

复制代码

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

复制代码

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的常用类库是:

  • # JSONPath
  • LINQ to JSON

参考文档:

Elasticsearch.Net and NEST: the .NET clients [5.x] » Search

Elasticsearch.Net and NEST: the .NET clients [5.x] » Query DSL

作者: 悦光阴

出处: http://www.cnblogs.com/ljhdo/

本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/Jeely/p/11315326.html

发表评论

表情:
评论列表 (有 0 条评论,23人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue门第

    1.路由的概念 路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源。 那么url地址和真实的资