惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard
c# es 封装Elastic.Clients.Elasticsearch
Hey,Coder! · 2026-03-02 · via 博客园 - Hey,Coder!

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}");
        }
    }
}