设为首页 收藏本站
查看: 1122|回复: 0

[经验分享] ElasticSearch入门 第五篇:使用C#查询文档

[复制链接]

尚未签到

发表于 2017-7-1 12:57:23 | 显示全部楼层 |阅读模式
  这是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 = 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" }
};
  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的分享,代码可以进一步封装,在此文中,仅仅作为演示:


DSC0000.gif DSC0001.gif


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="9200")
{
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 = 1000 * 60;
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();
}
}
}
}
View Code  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] &raquo; Search
  Elasticsearch.Net and NEST: the .NET clients [5.x] &raquo; Query DSL

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390012-1-1.html 上篇帖子: 玩转Storage Table 的PartitionKey,RowKey设计 下篇帖子: 在ASP.NET中如何运行后台任务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表