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

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
O
OpenAI News
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Webroot Blog
Webroot Blog
Google Online Security Blog
Google Online Security Blog
云风的 BLOG
云风的 BLOG
N
News | PayPal Newsroom
H
Hacker News: Front Page
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Heimdal Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Schneier on Security
宝玉的分享
宝玉的分享
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
Microsoft Security Blog
Microsoft Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
Cloudbric
Cloudbric
TaoSecurity Blog
TaoSecurity Blog
人人都是产品经理
人人都是产品经理
P
Palo Alto Networks Blog
M
MIT News - Artificial intelligence
G
GRAHAM CLULEY
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
T
Troy Hunt's Blog
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
量子位
博客园 - 聂微东
S
Securelist
博客园 - 三生石上(FineUI控件)
F
Full Disclosure
G
Google Developers Blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
AI
AI
PCI Perspectives
PCI Perspectives

博客园 - Hey,Coder!

Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容 ubuntu24.04 安装docker RAG 检索增强生成 软考 - 架构设计师 知识点总结 c# MailKit3.4.3 发送邮件、附件 nginx 反向代理postgresql c# 信号量 elsa 3.5 中间件记录最后执行的节点数据 xp密钥 c# System.Text.Json 反序列化Dictionary<string,object>时未转换基础类型的处理方法 docker配置代理 openclaw 接入 LMStudio的模型服务 wpf canvas 移动 缩放 windows平台openclaw搭建 wpf scrollerview触摸滚动 c# 动态切换sqlsugar连接字符串 c# Elastic.Clients.Elasticsearch 动态查询 c# scrollerview滚动到指定元素位置 WPF 重写Expander 基于elsa工作流封装一套变量、组件的体系 常用活动重写 DynamicExpresso 轻量级动态表达式库 c# elsa 3.5.2 程序化工作流常用功能及自定义中间件 leaflet docker 连接老版本的sqlserver ssl错误 c# quartz 动态创建任务 控制任务运行和停止 依赖注入 cefsharp 模拟点击 批量重置数据库的数据 docker 复制远程镜像本地并创建容器 c# newtonsoft dynamic
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}");
        }
    }
}