c# es 封装Elastic.Clients.Elasticsearch
nuget
Elastic.Clients.Elasticsearch 9.3.1
util
public static class EsUtil
{
/// <summary>
/// 获取ElasticsearchClient
/// </summary>
/// <param name="url">ElasticSearch服务器地址</param>
/// <param name="defaultIndex">默认索引名称</param>
/// <returns></returns>
public static ElasticsearchClient CreateClient(string url, string defaultIndex = "")
{
var uri = new Uri(url);
var settings = new ElasticsearchClientSettings(uri);
if (!string.IsNullOrWhiteSpace(defaultIndex))
{
settings.DefaultIndex(defaultIndex);
}
return new ElasticsearchClient(settings);
}
/// <summary>
/// 获取ElasticsearchClient(带认证)
/// </summary>
/// <param name="url">ElasticSearch服务器地址</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <param name="defaultIndex">默认索引名称</param>
/// <returns></returns>
public static ElasticsearchClient CreateClient(string url, string username, string password, string defaultIndex = "")
{
var uri = new Uri(url);
var settings = new ElasticsearchClientSettings(uri)
.Authentication(new BasicAuthentication(username, password));
if (!string.IsNullOrWhiteSpace(defaultIndex))
{
settings.DefaultIndex(defaultIndex);
}
return new ElasticsearchClient(settings);
}
/// <summary>
/// 获取ElasticsearchClient(集群连接)
/// </summary>
/// <param name="urls">ElasticSearch集群地址</param>
/// <param name="defaultIndex">默认索引名称</param>
/// <returns></returns>
public static ElasticsearchClient Client(string[] urls, string defaultIndex = "")
{
var nodes = urls.Select(h => new Uri(h)).ToArray();
var pool = new StaticNodePool(nodes);
var settings = new ElasticsearchClientSettings(pool);
if (!string.IsNullOrWhiteSpace(defaultIndex))
{
settings.DefaultIndex(defaultIndex);
}
return new ElasticsearchClient(settings);
}
/// <summary>
/// 创建文档
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static async Task<bool> Create<T>(this ElasticsearchClient client, T obj, string? index = null) where T : class
{
var response = await client.IndexAsync(obj, index);
CheckValid<T>(response);
return response.IsSuccess();
}
/// <summary>
/// 删除文档
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="id"></param>
/// <returns></returns>
public static async Task<bool> Delete<T>(this ElasticsearchClient client, string id, string? index = null) where T : class
{
var response = await client.DeleteAsync<T>(id, idx => idx.Index(index));
CheckValid<T>(response);
return response.IsSuccess();
}
/// <summary>
/// 更新文档
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="id"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static async Task<bool> Update<T>(this ElasticsearchClient client, string id, T obj, string? index = null) where T : class
{
var response = await client.UpdateAsync<T, T>(index, id, u => u.Doc(obj));
CheckValid<T>(response);
return response.IsSuccess();
}
/// <summary>
/// 获取文档
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="id"></param>
/// <returns></returns>
public static async Task<T?> Get<T>(this ElasticsearchClient client, string id, string? index = null) where T : class
{
var response = await client.GetAsync<T>(id, idx => idx.Index(index));
CheckValid<T>(response);
return response.Source;
}
/// <summary>
/// 获取文档list
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="ids"></param>
/// <returns></returns>
public static async Task<List<T>> GetList<T>(this ElasticsearchClient client, Action<QueryDescriptor<T>> query, string? index = null) where T : class
{
//var response = await client.MultiGetAsync(mg => mg
// .GetMany<T>(ids, (gd, id) => gd.Id(id).Index(index))
//);
var response = await client.SearchAsync<T>(s => s
.Indices(index)
.Query(query)
);
if (!response.IsSuccess())
{
throw new Exception($"MultiGet failed: {response.DebugInformation}");
}
return response.Documents.ToList();
}
/// <summary>
/// 获取分页文档
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="client"></param>
/// <param name="query"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static async Task<PageModel<T>> GetPageList<T>(
this ElasticsearchClient client,
Action<QueryDescriptor<T>> query,
int pageIndex = 1,
int pageSize = 10,
string? index = null)
where T : class
{
if (pageIndex <= 0 || pageSize <= 0)
{
throw new Exception("ErrorPageInfo");
}
var from = (pageIndex - 1) * pageSize;
var response = await client.SearchAsync<T>(s => s
.Indices(index)
.From(from)
.Size(pageSize)
.Query(query)
);
CheckValid<T>(response);
return new PageModel<T>
{
Data = response.Documents.ToList(),
TotalCount = response.Total
};
}
private static void CheckValid<T>(ElasticsearchResponse response) where T : class
{
if (!response.IsSuccess())
{
throw new Exception($"Elasticsearch request failed: {response.DebugInformation}");
}
}
}
留待后查,同时方便他人
联系我:ivesbao@163.com
联系我:ivesbao@163.com

浙公网安备 33010602011771号