ElasticSearch入门 第五篇:使用C#查询文档
来源:互联网 发布:美少女梦工厂4工作数据 编辑:程序博客网 时间:2024/05/17 23:52
使用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)。
//windowssr.From = 0;sr.Size = 100;//sortISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };sr.Sort = new List<ISort>();sr.Sort.Add(sort);//source filtersr.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 = 0; sr.Size = 100; //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 = 2; mq.Operator = Operator.Or; sr.Query = mq; sr.From = 0; sr.Size = 100; 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 = 20000; 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=1 }, new MatchQuery() { Field ="eventname", Query="aws google", Operator=Operator.Or, MinimumShouldMatch=1 } }; bq.Should = new QueryContainer[] { new TermQuery() { Field="description", Value="azure" }, new TermQuery() { Field="description", Value="cloud" } }; bq.MinimumShouldMatch = 1; 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的分享,代码可以进一步封装,在此文中,仅仅作为演示:
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的常用类库是:
- # 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
- ElasticSearch入门 第五篇:使用C#查询文档
- ElasticSearch入门 第四篇:使用C#添加和更新文档
- elasticsearch 第五篇(文档操作接口)
- rsyslog 入门 第五篇 out put elasticsearch
- elasticsearch 查询删除文档
- Elasticsearch 查询使用
- 使用SQL查询Elasticsearch
- ElasticSearch查询的使用
- ElasticSearch入门常用查询语句
- Elasticsearch.Net使用(一)【入门篇】
- ElasticSearch.net第五步-c#操作ElasticSearch详解
- ElasticSearch使用入门
- elasticsearch入门使用
- Elasticsearch(入门篇)——Query DSL与查询行为
- ElasticSearch入门 第九篇:实现正则表达式查询的思路
- ElasticSearch使用教程四(ElasticSearch查询详解)
- ElasticSearch使用教程四(ElasticSearch查询详解)
- elasticsearch之创建文档并查询
- ssm 整合 (springmvc + spring + mybatis )
- 黑客白皮书:如何成为一名黑客(附FAQ)
- Tensorflow-model API
- 线程
- 企业级前端组件库方案
- ElasticSearch入门 第五篇:使用C#查询文档
- linux基础(十四)定时任务和管理系统的临时文件
- 动态链接库的创建
- Java面向对象的三个特征与含义
- Sublime3 的使用
- Android追加换行写入内容到txt文件中
- linux系统下安装两个或多个tomcat
- spring定时器规则
- Choice学姐买糖果