十三、.net core(.NET 6)搭建ElasticSearch(ES)系列之dotnet操作ElasticSearch进行存取的方法

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: .net core操作ES进行读写数据操作在Package包项目下,新增NEST包。注意,包版本需要和使用的ES的版本保持一致,可以避免因为不兼容所导致的一些问题。例如我本机使用的ES版本是7.13版本,所以我安装的NEST包也是7.13版本:


.net core操作ES进行读写数据操作

 

Package包项目下,新增NEST包。注意,包版本需要和使用的ES的版本保持一致,可以避免因为不兼容所导致的一些问题。例如我本机使用的ES版本是7.13版本,所以我安装的NEST包也是7.13版本:

1995789-20210606234007633-1659474478.png


Common文件夹下,新建类库项目 Wsk.Core.ElasticSearch,并新建类ElasticSearchConnection,用于提供一些操作方法。以及新建一个对应的接口IElasticSearchConnection。然后引用包项目,以及AppHelper项目备用:

1995789-20210606234016431-1281256998.png

 

Entity项目下,新建一个ES配置实体类,叫ElasticConnectionInfo,以及在appsettings配置文件下,新增一组ES的连接配置信息,包括索引和url地址:


1995789-20210606234035511-1159510506.png

1995789-20210606234115447-1110878312.png

代码:


public class ElasticConnectionInfo
    {
        public string Url { get; set; }
        public string Index { get; set; }
    }
"ES": [
    {
      "Index": "wesky",
      "Url": "http://localhost:9200"
    }
  ]

 

然后,在ElasticSearchConnection类下面,添加一些构造依赖注入,以及添加一个连接方法ESConnection

1995789-20210606234233323-474198121.png


接着新建一个实体类 ElasticTestDataInfo,用于做一个模拟数据测试:


1995789-20210606234245185-322636778.png


代码:


public class ElasticTestDataInfo
    {
        public int Code { get; set; }
        public string Function { get; set; }
        public string Message { get; set; }
    }


 

现在,在启动项目下面,新建文件夹WskHostedService,用于存放启动项有关内容。以及新建一个类,叫InitialService,并且继承自 IHostedService, IDisposable


1995789-20210606234332530-318008543.png

该方法是用于项目启动时候执行的,我们把连接ES的部分,写到这里面来。似乎接口用不到,把ElasticSearchConnection继承的IElasticSearchConnection屏蔽掉,然后把ESConnection方法设置为静态的,然后在上面创建的类中的StartAsync下面,进行ES的初始化连接:

1995789-20210606234352880-2085784188.png

 

然后在WskService类里面,通过使用AddHostedService添加对该初始化服务的注册:

1995789-20210606234407235-1182586877.png


现在配置完毕,在控制器里面,分别添加单个写入和批量写入的api,大概内容如下:

1995789-20210606234424073-2006994073.png

 

我配置文件里面的索引是wesky,为了确保实验效果,我先使用kibana的页面进行查询是否wesky索引是否有内容:

1995789-20210606234439795-1124621684.png


没有wesky索引,可以开始启动程序(备注:正常使用期间不需要删除索引,会导致写入的数据丢失,我此处只是为了方便效果验证使用)

先启动程序,为了查看连接是否成功,我把连接成功信息打印出来:

1995789-20210606234455678-1259333268.png


至此,连接ES部分的类代码如下:


 public class ElasticSearchConnection
    {
        public static ElasticClient _esClient;
        //private readonly ILogger<ElasticSearchConnection> _logger;
        //public ElasticSearchConnection(ILogger<ElasticSearchConnection> logger)
        //{
        //    _logger = logger;
        //}
        public static void ESConnection()
        {
            List<ElasticConnectionInfo> configInfo = AppHelper.ReadAppSettings<ElasticConnectionInfo>(new string[] { "ES" });
            if (configInfo.Any())
            {
                var settings = new ConnectionSettings(new Uri(configInfo.FirstOrDefault().Url))
                    .DefaultIndex(configInfo.FirstOrDefault().Index);
                _esClient = new ElasticClient(settings);
                Console.WriteLine("ES已连接");
            }
            else
            {
                Console.WriteLine("ES连接未配置\n");
            }
        }
    }

 

现在通过swagger写入一个数据看看效果:

1995789-20210606234517055-714429167.png


Swagger上面调用成功,我们上kibana页面上进行查询看看是否真的写入成功了:

1995789-20210606234548437-1751411876.png

 

如图所示,说明写入成功了。接下来测试批量写入的,我们发送两条记录进行测试:

1995789-20210606234624577-331002745.png


使用kibana页面进行查询,看看是不是都写入成功了:

1995789-20210606234640635-1441858452.png


如上,说明写入成功!需要注意的一点是,写入ES里面,ES默认有1秒时间是查不出来的,需要1秒以后才可以查到记录,对于实时性不是特别高,所以不适合用于做数据库,但是用于对实时性要求不高的数据来说,问题就不大了。

 

现在不使用kibana进行查询,使用es自带的工具进行查询看看效果:

es根目录下,bin文件夹下有一个elasticsearch-sql-cli.bat文件,双击即可打开:

1995789-20210606234656339-949291711.png


该工具可以进行使用SQL语句进行查询,咱来示范下通过它来查询刚刚写入的三个数据。由于索引就是一个表,所以我直接使用 select * from wesky; 进行查询,效果如下:

 1995789-20210606234706924-772933871.png


与常见数据库操作几乎一样,我们来个倒序:

1995789-20210606234718040-2081025870.png


接下来在程序上进行查询,先创建一个查询的api进行调用,然后查询出结果进行打印,内容如下:

1995789-20210606234730609-466923539.png


运行程序,我输入name,进行匹配,返回查询结果:

1995789-20210606234745659-1617683564.png


出于时间关系,就不再演示显示条数的内容了,各位大佬可以自行测试。

由于ES本身也支持sql查询,所以接下来演示下使用SQL语句进行查询的效果。先新建一个实体类EsSearchSql,里面只有一个query字段,用于存放查询的sql语句使用

1995789-20210606234804613-1244879930.png

 

然后新增一个api,用于可以在swagger上面输入sql语句进行查询,有关内容如下:

1995789-20210606234822220-908495530.png


至此,控制器类代码整体如下:


[Route("[controller]/[action]")]
    [ApiController]
    public class WSKController : ControllerBase
    {
        private readonly ITestAutofac _autofac;
        private readonly ILogger<WSKController> _logger;
        private readonly IRedisManage _redis;
        private readonly IHttpClientHelper _httpClient;
        private readonly IHttpWebRequestHelper _httpWebRequestHelper;
        public WSKController(ITestAutofac autofac, ILogger<WSKController> logger, IRedisManage redis, IHttpClientHelper httpClient, IHttpWebRequestHelper httpWebRequestHelper) {
            _autofac = autofac;
            _logger = logger;
            _redis = redis;
            _httpClient = httpClient;
            _httpWebRequestHelper = httpWebRequestHelper;
        }
        [HttpPost]
        public IActionResult IndexSingle([FromBody] ElasticTestDataInfo info)
        {
            ElasticSearchConnection._esClient.IndexDocument(info);
            return Ok("OK");
        }
        [HttpPost]
        public IActionResult IndexMany([FromBody] List<ElasticTestDataInfo> info)
        {
            ElasticSearchConnection._esClient.IndexMany<ElasticTestDataInfo>(info);
            return Ok("OK");
        }
        [HttpPost]
        public IActionResult SearchByLinq(string name)
        {
            var searchResponse = ElasticSearchConnection._esClient.Search<ElasticTestDataInfo>(s => s
                 .From(0)
                 .Size(2)
                 .Query(q => q
                      .Match(m => m
                         .Field(f => f.Message)
                         .Query(name)
                      )
                 )
             );
            var info = searchResponse.Documents;
            return Ok(info);
        }
        [HttpPost]
        public IActionResult SearchBySql(string sql)
        {
            string res = string.Empty;
            try
            {
                string url = "http://127.0.0.1:9200/_xpack/sql?format=csv"; // format=csv,可以过滤掉其他不需要的内容,仅返回报表格式
                EsSearchSql esData = new() { query = sql}; // 赋值对应查询的sql语句
                string jsonData = JsonConvert.SerializeObject(esData); 
                res = _httpClient.Post(url, jsonData); // 使用post进行发送查询请求
            }
            catch(Exception ex)
            {
                res = ex.Message;
            }
            return Ok(res);
        }
    }

 

启动程序,我输入 select * from wesky 当作参数进行查询,看下效果:

1995789-20210606234841322-757871724.png


如上,说明使用SQL查询也成功了。使用两种方法都可以查询,看个人喜好了~~ 同时,如果需要做一些可视化报表什么的,也都是可以使用的。一些更详细的内容,就不再做过多操作了,大佬们可以自己玩,祝大家好运~~


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
9天前
|
API 网络安全 数据安全/隐私保护
.NET邮箱API发送邮件的方法有哪些
本文介绍了.NET开发中使用邮箱API发送邮件的方法,包括SmtpClient类发送邮件、MailMessage类创建邮件消息、设置SmtpClient属性、同步/异步发送、错误处理、发送HTML格式邮件、带附件邮件以及多人邮件。AokSend提供高触达发信服务,适用于大规模验证码发送场景。了解这些技巧有助于开发者实现高效、可靠的邮件功能。
|
9天前
|
存储 开发框架 前端开发
前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构
发展历史:实验室信息管理系统(LIMS),就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现代的管理思想有机结合,利用数据处理技术、海量数据存储技术、宽带传输网络技术、自动化仪器分析技术,来对实验室的信息管理和质量控制等进行全方位管理的计算机软、硬件系统,以满足实验室管理上的各种目标(计划、控制、执行)。
24 1
|
9天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
65 3
|
9天前
Elasticsearch【问题记录 02】【不能以root运行es + max virtual memory areas vm.max_map_count [65530] is too low处理】
【4月更文挑战第12天】Elasticsearch【问题记录 02】【不能以root运行es + max virtual memory areas vm.max_map_count [65530] is too low处理】
24 3
|
1天前
|
Oracle 关系型数据库 API
实时计算 Flink版产品使用合集之当sink到elasticsearch时,可以指定es的指定字段吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之当sink到elasticsearch时,可以指定es的指定字段吗
|
1天前
|
Kubernetes 关系型数据库 MySQL
实时计算 Flink版产品使用合集之在Kubernetes(k8s)中同步MySQL变更到Elasticsearch该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1天前
|
Prometheus 监控 Cloud Native
实时计算 Flink版操作报错之在使用ES时遇到“java.lang.IllegalStateException: The elasticsearch emitter must be serializable”,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
8天前
|
SQL 监控 API
实时计算 Flink版产品使用合集之可以用来同步数据到 Elasticsearch(ES)吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
20 0
实时计算 Flink版产品使用合集之可以用来同步数据到 Elasticsearch(ES)吗
|
9天前
|
Java API
Java操作elasticsearch
Java操作elasticsearch
17 0
|
9天前
|
开发框架 .NET C语言
LabVIEW中使用.NET方法时出现错误1316
LabVIEW中使用.NET方法时出现错误1316
20 4

热门文章

最新文章