十三、.net core(.NET 6)搭建ElasticSearch(ES)系列之dotnet操作ElasticSearch進行存取的方法


 

.net core操作ES進行讀寫數據操作

 

Package包項目下,新增NEST包。注意,包版本需要和使用的ES的版本保持一致,可以避免因為不兼容所導致的一些問題。例如我本機使用的ES版本是7.13版本,所以我安裝的NEST包也是7.13版本:

 

 

Common文件夾下,新建類庫項目 Wsk.Core.ElasticSearch,並新建類ElasticSearchConnection,用於提供一些操作方法。以及新建一個對應的接口IElasticSearchConnection。然后引用包項目,以及AppHelper項目備用:

 

 

Entity項目下,新建一個ES配置實體類,叫ElasticConnectionInfo,以及在appsettings配置文件下,新增一組ES的連接配置信息,包括索引和url地址:

 

 

代碼:

public class ElasticConnectionInfo
    {
        public string Url { get; set; }
        public string Index { get; set; }
    }
 "ES": [
    {
      "Index": "wesky",
      "Url": "http://localhost:9200"
    }
  ]

 

 

然后,在ElasticSearchConnection類下面,添加一些構造依賴注入,以及添加一個連接方法ESConnection

 

 

接着新建一個實體類 ElasticTestDataInfo,用於做一個模擬數據測試:

 

 代碼:

public class ElasticTestDataInfo
    {
        
        public int Code { get; set; }
        public string Function { get; set; }
        public string Message { get; set; }

    }

 

現在,在啟動項目下面,新建文件夾WskHostedService,用於存放啟動項有關內容。以及新建一個類,叫InitialService,並且繼承自 IHostedService, IDisposable

 

 

該方法是用於項目啟動時候執行的,我們把連接ES的部分,寫到這里面來。似乎接口用不到,把ElasticSearchConnection繼承的IElasticSearchConnection屏蔽掉,然后把ESConnection方法設置為靜態的,然后在上面創建的類中的StartAsync下面,進行ES的初始化連接:

 

 

然后在WskService類里面,通過使用AddHostedService添加對該初始化服務的注冊:

 

 

現在配置完畢,在控制器里面,分別添加單個寫入和批量寫入的api,大概內容如下:

 

 

我配置文件里面的索引是wesky,為了確保實驗效果,我先使用kibana的頁面進行查詢是否wesky索引是否有內容:

 

 

沒有wesky索引,可以開始啟動程序(備注:正常使用期間不需要刪除索引,會導致寫入的數據丟失,我此處只是為了方便效果驗證使用)

先啟動程序,為了查看連接是否成功,我把連接成功信息打印出來:

 

 

至此,連接ES部分的類代碼如下:

   public class ElasticSearchConnection
    {
        public static ElasticClient _esClient;

        //private readonly ILogger<ElasticSearchConnection> _logger;
        //public ElasticSearchConnection(ILogger<ElasticSearchConnection> logger)
        //{
        //    _logger = logger;
        //}

        public static void ESConnection()
        {
            List<ElasticConnectionInfo> configInfo = AppHelper.ReadAppSettings<ElasticConnectionInfo>(new string[] { "ES" });
            if (configInfo.Any())
            {
                var settings = new ConnectionSettings(new Uri(configInfo.FirstOrDefault().Url))
                    .DefaultIndex(configInfo.FirstOrDefault().Index);
                _esClient = new ElasticClient(settings);
                Console.WriteLine("ES已連接");
            }
            else
            {
                Console.WriteLine("ES連接未配置\n");
            }

        }

    }
View Code

 

 

現在通過swagger寫入一個數據看看效果:

 

 

Swagger上面調用成功,我們上kibana頁面上進行查詢看看是否真的寫入成功了:

 

 

如圖所示,說明寫入成功了。接下來測試批量寫入的,我們發送兩條記錄進行測試:

 

 

使用kibana頁面進行查詢,看看是不是都寫入成功了:

 

 

如上,說明寫入成功!需要注意的一點是,寫入ES里面,ES默認有1秒時間是查不出來的,需要1秒以后才可以查到記錄,對於實時性不是特別高,所以不適合用於做數據庫,但是用於對實時性要求不高的數據來說,問題就不大了。

 

現在不使用kibana進行查詢,使用es自帶的工具進行查詢看看效果:

es根目錄下,bin文件夾下有一個elasticsearch-sql-cli.bat文件,雙擊即可打開:

 

 

該工具可以進行使用SQL語句進行查詢,咱來示范下通過它來查詢剛剛寫入的三個數據。由於索引就是一個表,所以我直接使用 select * from wesky; 進行查詢,效果如下:

 

 

與常見數據庫操作幾乎一樣,我們來個倒序:

 

 

接下來在程序上進行查詢,先創建一個查詢的api進行調用,然后查詢出結果進行打印,內容如下:

 

 

運行程序,我輸入name,進行匹配,返回查詢結果:

 

 

出於時間關系,就不再演示顯示條數的內容了,各位大佬可以自行測試。

由於ES本身也支持sql查詢,所以接下來演示下使用SQL語句進行查詢的效果。先新建一個實體類EsSearchSql,里面只有一個query字段,用於存放查詢的sql語句使用

 

 

然后新增一個api,用於可以在swagger上面輸入sql語句進行查詢,有關內容如下:

 

 至此,控制器類代碼整體如下:

  [Route("[controller]/[action]")]
    [ApiController]
    public class WSKController : ControllerBase
    {
        private readonly ITestAutofac _autofac;
        private readonly ILogger<WSKController> _logger;
        private readonly IRedisManage _redis;
        private readonly IHttpClientHelper _httpClient;
        private readonly IHttpWebRequestHelper _httpWebRequestHelper;

        public WSKController(ITestAutofac autofac, ILogger<WSKController> logger, IRedisManage redis, IHttpClientHelper httpClient, IHttpWebRequestHelper httpWebRequestHelper) {
            _autofac = autofac;
            _logger = logger;
            _redis = redis;
            _httpClient = httpClient;
            _httpWebRequestHelper = httpWebRequestHelper;
        }
        [HttpPost]
        public IActionResult IndexSingle([FromBody] ElasticTestDataInfo info)
        {
            ElasticSearchConnection._esClient.IndexDocument(info);

            return Ok("OK");
        }

        [HttpPost]
        public IActionResult IndexMany([FromBody] List<ElasticTestDataInfo> info)
        {

            ElasticSearchConnection._esClient.IndexMany<ElasticTestDataInfo>(info);

            return Ok("OK");
        }

        [HttpPost]
        public IActionResult SearchByLinq(string name)
        {

            var searchResponse = ElasticSearchConnection._esClient.Search<ElasticTestDataInfo>(s => s
                 .From(0)
                 .Size(2)
                 .Query(q => q
                      .Match(m => m
                         .Field(f => f.Message)
                         .Query(name)
                      )
                 )
             );
            var info = searchResponse.Documents;
           
            return Ok(info);
        }


        [HttpPost]
        public IActionResult SearchBySql(string sql)
        {
            string res = string.Empty;
            try
            {
                string url = "http://127.0.0.1:9200/_xpack/sql?format=csv"; // format=csv,可以過濾掉其他不需要的內容,僅返回報表格式
                EsSearchSql esData = new() { query = sql}; // 賦值對應查詢的sql語句
                string jsonData = JsonConvert.SerializeObject(esData); 

                res = _httpClient.Post(url, jsonData); // 使用post進行發送查詢請求

            }
            catch(Exception ex)
            {
                res = ex.Message;
            }

            return Ok(res);
        }


    }
View Code

 

啟動程序,我輸入 select * from wesky 當作參數進行查詢,看下效果:

 

 

如上,說明使用SQL查詢也成功了。使用兩種方法都可以查詢,看個人喜好了~~ 同時,如果需要做一些可視化報表什么的,也都是可以使用的。一些更詳細的內容,就不再做過多操作了,大佬們可以自己玩,祝大家好運~~

完結,撒花~~歡迎大佬們互動~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM