【微服务】.NET8对接ElasticSearch

目录

一、目的

二、对接方案

[2.1 环境准备](#2.1 环境准备)

[2.2 引入NEST](#2.2 引入NEST)

[2.3 添加一个对象](#2.3 添加一个对象)

[2.4 添加一个集合](#2.4 添加一个集合)

[2.5 Sql语句查询](#2.5 Sql语句查询)

[2.6 Sql语句查询支持分词字段查询](#2.6 Sql语句查询支持分词字段查询)

三、文章总结


一、目的

实现使用.Net8下对接ElasticSearch7.16.3单机和集群环境,使用Nuget引入NEST包,支持

.NET 5+和.NET Framework 4.6.1+

二、对接方案

2.1 环境准备

Sql的查询,IK分词器的支持。

环境: ES: 7.16.3 有Sql查询的插件+ IK分词的版本支持

ES镜像: docker.elastic.co/elasticsearch/elasticsearch:7.16.3

Kibana镜像:docker.elastic.co/kibana/kibana:7.16.3

相关安装可参考下方博客:

[微服务]ELK Stack安装与配置全指南-CSDN博客

2.2 引入NEST

Nuget引入程序集:NEST

dotnet add packages NEST

配置连接ES

cs 复制代码
    //链接配置
    //配置默认的索引--索引的名称--不能包含大写的字母
    ConnectionSettings settings = new ConnectionSettings(new Uri("http://ip:9200"))
      .DefaultIndex("myindex");  //索引:DefaultIndex
    ElasticClient client = new ElasticClient(settings);

2.3 添加一个对象

cs 复制代码
public static void InsertObject()
      {
          var settings = new ConnectionSettings(new
Uri(UrlConstant.BaseUrl)).DefaultIndex("traceinfolog");
          //添加数据
          {
              TraceInfo traceInfo = new TraceInfo()
              {
                  RpcID = Guid.NewGuid().ToString(),
                  Message = "message",
                  Time = DateTime.Now
              };
              var client = new ElasticClient(settings);
              client.IndexDocument(traceInfo);
          }
      }

2.4 添加一个集合

cs 复制代码
public static void InsertObjectList()
      {
          var settings = new ConnectionSettings(new Uri(UrlConstant.BaseUrl))
          .DefaultIndex("order");
          var client = new ElasticClient(settings);
          List<OrderInfo> orderInfos = new List<OrderInfo>();
          for (int i = 0; i < 20; i++)
          {
              orderInfos.Add(new OrderInfo()
              {
                  Orderid = Guid.NewGuid().ToString(),
                  ActionTime = DateTime.UtcNow.AddMinutes(-15),
                  Name = "test" + i,
                  Address = "测试1",
                  Status = "购物车"
              });
          }
          for (int i = 0; i < 20; i++)
          {
              orderInfos.Add(new OrderInfo()
              {
                  Orderid = Guid.NewGuid().ToString(),
                  ActionTime = DateTime.UtcNow.AddMinutes(-20),
                  Name = "test" + i,
                  Address = "测试2",
                  Status = "支付"
              });
          }
          for (int i = 0; i < 20; i++)
          {
              orderInfos.Add(new OrderInfo()
              {
                  Orderid = Guid.NewGuid().ToString(),
                  ActionTime = DateTime.UtcNow.AddMinutes(-2),
                  Name = "test" + i,
                  Address = "测试2",
                  Status = "未支付"
              });
          }
          for (int i = 0; i < 20; i++)
          {
              orderInfos.Add(new OrderInfo()
              {
                  Orderid = Guid.NewGuid().ToString(),
                  ActionTime = DateTime.UtcNow.AddMinutes(-9),
                  Name = "test" + i,
                  Address = "测试3",
                  Status = "已配送"
              });
          }
          BulkResponse response= client.IndexMany(orderInfos);
          if (response.IsValid)
          {
              Console.WriteLine("批量添加成功~");
          }
      }

2.5 Sql语句查询

注意:_xpack/sql?format=csv 查询,不能把带有索引的字段当做查询字段或者where条件字段

cs 复制代码
//_xpack/sql?format=csv 方法
public static string Post(QueryParam queryParam, string baserUrl)
      {
          string url = $"{baserUrl}_xpack/sql?format=csv";
          HttpWebRequest request = null;
          try
          {
              request = (HttpWebRequest)WebRequest.Create(url);
              var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(queryParam));
              //request.Accept = "application/json; charset=UTF-8"; // 设置响应数据的
ContentType
              request.Method = "POST";
              request.ContentType = "application/json"; // 设置请求数据的ContentType
              request.ContentLength = data.Length;
              request.Timeout = 90000;
              using (var stream = request.GetRequestStream())   // 设置入参
              {
                  stream.Write(data, 0, data.Length);
              }
              var response = (HttpWebResponse)request.GetResponse(); // 发送请求
              using (var resStream = response.GetResponseStream()) // 读取出参
              {
                  using (var reader = new StreamReader(resStream, Encoding.UTF8))
                  {
                      return reader.ReadToEnd();
                  }
              }
          }
          catch (Exception ex)
          {
              return null;
          }
          finally
          {
               if (request != null) request.Abort(); // 释放连接
          }
      }

2.6 Sql语句查询支持分词字段查询

解决2.5中无法查询带分词索引字段的问题。添加插件,下载后解决,然后Docker挂载。挂载方法可以查看上述上一篇博文。

下载地址:

https://github.com/NLPchina/elasticsearch-sql/releases/

注意:这里需要匹配ElasticSearch-sql和ElasticSearch的版本;

插叙测试方法:

cs 复制代码
public static string Post(string queryParam, string baserUrl)
      {
          string url = $"{baserUrl}_nlpcn/sql";
          HttpWebRequest request = null;
          try
          {
              request = (HttpWebRequest)WebRequest.Create(url);
              var data = Encoding.UTF8.GetBytes(queryParam);
              request.Accept = "application/json; charset=UTF-8"; // 设置响应数据的ContentType
              request.Method = "POST";
              request.ContentType = "application/json"; // 设置请求数据的ContentType
              request.ContentLength = data.Length;
              request.Timeout = 90000;
              using (var stream = request.GetRequestStream()) // 设置入参
              {
                  stream.Write(data, 0, data.Length);
              }
              var response = (HttpWebResponse)request.GetResponse(); // 发送请求
              using (var resStream = response.GetResponseStream()) // 读取出参
              {
                  using (var reader = new StreamReader(resStream, Encoding.UTF8))
                  {
                      return reader.ReadToEnd();
                  }
              }
          }
          catch (Exception ex)
          {
              return null;
          }
          finally
          {
              if (request != null) request.Abort();
          }
}

三、文章总结

本文主要讲解.Net对接ES的相关方法,并通过相关示例说明查询ES的方式。其实主要方法还是通过Http请求ES。