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

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

ElasticSearch入门 第五篇:使用C#查询文档的更多相关文章

  1. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  2. ElasticSearch入门 第七篇:分词

    这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  3. ElasticSearch入门 第八篇:存储

    这是ElasticSearch 2.4 版本系列的第八篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. ElasticSearch入门 第四篇:使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  5. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. ElasticSearch查询 第五篇:布尔查询

    布尔查询是最常用的组合查询,不仅将多个查询条件组合在一起,并且将查询的结果和结果的评分组合在一起.当查询条件是多个表达式的组合时,布尔查询非常有用,实际上,布尔查询把多个子查询组合(combine)成 ...

  7. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  8. MongoDB基础教程系列--第四篇 MongoDB 查询文档

    查询文档 查询文档可以用 find() 方法查询全部文档,可以用 findOne() 查询第一个文档,当然还可以根据 条件操作符 和 $type操作符 查询满足条件的文档. find() 和 find ...

  9. Elasticsearch 使用集群 - 创建和查询文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

随机推荐

  1. 解释JS变量作用域的范例

    JS的变量作用域只有两种:全局作用域与函数作用域. 用var声明的变量不能简单的说是属于函数作用域,应该是说属于其最近的作用域. var a = 10; function test(){ var a; ...

  2. HDFS hflush hsync和close的区别

    HDFS的hflush,hsync和close有啥区别,分别做了什么 hflush: 语义是保证flush的数据被新的reader读到,但是不保证数据被datanode持久化. hsync: 与hfl ...

  3. python自学——列表

    #以下是我自己在联系列表中所编写的语句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi ...

  4. Django中的DateTimeField格式

    转自:http://www.nanerbang.com/article/5488/ 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来 ...

  5. nc 命令使用详解

    nc 命令介绍: Ncat is a feature-packed networking utility which reads and writes data across networks fro ...

  6. libcurl.dll 7.60.0静态库包含openssl/zlib

    最近做个QT的小程序需要使用LIBCURL支持HTTPS,结果查资料发现官方默认的是不支持的,需要手动重新编译,编译的时候加入SSL支持. 看着就好麻烦的样子, 找了一圈,还真有现成的,但是现在写程序 ...

  7. MySQL数据库常用操作和技巧

    MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...

  8. 使用mpVue开发小程序实战总结

    1.图形验证码接口返回base64格式的数据,使用image标签接收不显示问题. 解决方法: 使用wx.base64ToArrayBuffer和wx.arrayBufferToBase64转化一遍数据 ...

  9. 禁止选择DIV内的文本(css,js写法)

    css:<span style="font-family:SimSun;font-size:18px;">/* 禁止选择div内的文字 */ #hall_body { ...

  10. tcp尽快尽快了

    看的撒积分卡拉斯的放假啊的顺口溜