目录
一、目的
实现使用.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
相关安装可参考下方博客:
2.2 引入NEST
Nuget引入程序集:NEST
dotnet add packages NEST
配置连接ES
//链接配置
//配置默认的索引--索引的名称--不能包含大写的字母
ConnectionSettings settings = new ConnectionSettings(new Uri("http://ip:9200"))
.DefaultIndex("myindex"); //索引:DefaultIndex
ElasticClient client = new ElasticClient(settings);
2.3 添加一个对象
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 添加一个集合
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条件字段
//_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挂载。挂载方法可以查看上述上一篇博文。
下载地址:
注意:这里需要匹配ElasticSearch-sql和ElasticSearch的版本;
插叙测试方法:
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。