.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"); } } }
現在通過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); } }
啟動程序,我輸入 select * from wesky 當作參數進行查詢,看下效果:
如上,說明使用SQL查詢也成功了。使用兩種方法都可以查詢,看個人喜好了~~ 同時,如果需要做一些可視化報表什么的,也都是可以使用的。一些更詳細的內容,就不再做過多操作了,大佬們可以自己玩,祝大家好運~~
完結,撒花~~歡迎大佬們互動~~