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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介:

这是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 = 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();
            }
        }
    }
}
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的常用类库是:

 

参考文档:

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/p/4550135.html,如需转载请自行联系原作者

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
2月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
189 19
|
1月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
182 4
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
516 7
|
8月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
428 20
|
C#
C#入门
C#入门
102 0
|
开发框架 .NET API
以C#一分钟浅谈:GraphQL 数据类型与查询
本文从C#开发者的角度介绍了GraphQL的基本概念、核心组件及其实现方法。GraphQL由Facebook开发,允许客户端精确请求所需数据,提高应用性能。文章详细讲解了如何在C#中使用`GraphQL.NET`库创建Schema、配置ASP.NET Core,并讨论了GraphQL的数据类型及常见问题与解决方案。通过本文,C#开发者可以更好地理解并应用GraphQL,构建高效、灵活的API。
295 64
ELK 圣经:Elasticsearch、Logstash、Kibana 从入门到精通
ELK是一套强大的日志管理和分析工具,广泛应用于日志监控、故障排查、业务分析等场景。本文档将详细介绍ELK的各个组件及其配置方法,帮助读者从零开始掌握ELK的使用。
|
11月前
|
开发框架 .NET 测试技术
C# 一分钟浅谈:GraphQL 数据类型与查询
本文介绍了GraphQL的基本概念、数据类型及查询方法,重点从C#角度探讨了GraphQL的应用。通过Hot Chocolate库的实例,展示了如何在ASP.NET Core中实现GraphQL API,包括安装、定义Schema、配置及运行项目。文中还讨论了常见问题与解决方案,旨在帮助开发者更好地理解和使用GraphQL。
181 2
|
XML C# 开发工具
C# 删除Word文档中的段落
【11月更文挑战第3天】本文介绍了两种方法来操作 Word 文档:一是使用 `Microsoft.Office.Interop.Word` 库,适用于 Windows 环境下操作 Word 文档,需引用相应库并在代码中引入命名空间;二是使用 Open XML SDK,适用于处理 .docx 格式的文档,通过引用 `DocumentFormat.OpenXml` 库实现。文中提供了示例代码,展示了如何打开、删除段落并保存文档。
282 5
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
508 8