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

使用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的分享,代码可以进一步封装,在此文中,仅仅作为演示:

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();
            }
        }
    }
}

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

时间: 2024-10-25 08:49:47

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

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

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,

ElasticSearch入门 第八篇:存储

这是ElasticSearch 2.4 版本系列的第八篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 ElasticSearch入门 第七篇:分析器 Elasti

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

原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79228852 // 准备数据 PUT /shop/goods/1 { "name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服", &quo

〈二〉ElasticSearch的认识:索引、类型、文档

目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 小节总结: 类型type 补充: 小节总结: 文档document 插入文档 查询指定文档 更新文档 删除文档 查询所有文档 补充: 小节总结 发表日期:2019年9月19日 上节回顾 在学习新的内容之前,先回顾一下上节的内容,上节主要讲述了以下的内容: ElasticSearch是什么?什么是搜

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <

mongodb查询文档

说到查询,我们一般就想起了关系型数据库的查询了,比如:order by(排序).limit(分页).范围查询(大于某个值,小于某个值..,in查询,on查询,like查询等待很多),同样mongodb同样也支持这些操作,只是语法不同,比如排序:mongodb里面使用了skip(field:1/-1)方法,下面就来一一介绍一下: 一.mongodb查询文档 1.查询文档之find() : 不加条件是查询集合全部的数据 语法:db.collectionName.find({条件},{field:tr

火车票查询文档

火车票查询文档:可以查询到火车售票,车次,始发时间,地点,是否有座等一系列情况. 参见:http://www.haoservice.com/docs/25 { "error_code":"0", "reason":"Success", "result":[{ "sta_name":"北京北", "sta_ename":"beijingbe

mongodb(6):查询文档

find()方法 要从MongoDB集合查询数据,需要使用MongoDB的find()方法. 语法 find()命令的基本语法如下: >db.COLLECTION_NAME.find(document) Shell find()方法将以非结构化的方式显示所有文档. pretty()方法 要以格式化的方式显示结果,可以使用pretty()方法. 语法 > db.mycol.find().pretty() 示例 >db.mycol.find().pretty() { "_id&qu

MongoDB 查询文档随笔

由于之前只是使用 MongoDB 进行存储日志,没有做过分析,只做过通过 api 进行查询操作. 现在有场景需要使用连接工具直接查询分析.所以在此记录一下使用到的查询方法. MongoDB 查询文档使用 find() 方法. find() 方法以非结构化的方式来显示所有文档. 语法 MongoDB 查询数据的语法格式如下: db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返