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}");
        }
    }
}
posted @ 2026-03-02 14:53  Hey,Coder!  阅读(1)  评论(0)    收藏  举报