Search This Blog

Wednesday, January 8, 2020

Xây dựng CRUD sử dụng ASP.NET MVC kết nối với ElasticSearch chạy trên môi trường Docker

Tạo mới project ASP.NET MVC Core 3.1


Chọn loại project là Web Application (Model - View - Controller) -> Create.

Install packages:
- Elasticsearch.Net
- NEST


Tạo class ElasticSearchFactory để tạo client connector đến ElasticSearch
 namespace ElasticSearchClient  
 {  
   public class ElasticSearchFactory  
   {  
     public ElasticClient ElasticSearchClient()  
     {  
       var nodes = new Uri[]  
       {  
         new Uri("http://localhost:9200/"),  
       };  
       var connectionPool = new StaticConnectionPool(nodes);  
       var connectionSettings = new ConnectionSettings(connectionPool).DisableDirectStreaming();  
       var elasticClient = new ElasticClient(connectionSettings);  
       return elasticClient;  
     }  
   }  
 }  


Add new MVC controller with read/write actions, đặt tên là CatalogController.



Trong thư mục Models, tạo class Catalog.cs
 namespace ElasticSearchClient.Models  
 {  
   public class Catalog  
   {  
     public string Id { get; set; }  
     [Required]  
     public string Name { get; set; }  
     public string Description { get; set; }  
   }  
 }  


Trong CatalogController, khai báo ElasticSearchFactory
   public class CatalogController : Controller  
   {  
     private readonly ElasticSearchFactory _esFactory;  
     public CatalogController()  
     {  
       _esFactory = new ElasticSearchFactory();  
     }  


Viết đoạn code đoạn truy vấn đơn giản đến ElasticSearch trong action Index.
     // GET: Catalog  
     public async Task<ActionResult> Index()  
     {  
       return View(await DoSearchAsync());  
     }  
     private async Task<List<Catalog>> DoSearchAsync(string name = "")  
     {  
       var response = await (_esFactory.ElasticSearchClient().SearchAsync<Catalog>(s => s  
                   .Index("catalogs")  
                   .Size(50)  
                   .Query(q => q  
                     .Match(m => m  
                       .Field(f => f.Name)  
                       .Query(name)  
                     )  
                   )  
                 ));  
       return response.Hits.Select(s => s.Source).ToList();  
     }  

Tiến hành Add New View cho action Index như hình bên dưới, với:
- Template: List
- Model class: Catalog (tạo ở bước trước)



Kết quả view Index được tạo ra như hình bên dưới

Nhấn F5 để chạy chương trình, sau đó đi đến trang Catalog theo đường dẫn https://localhost:[your-port]/Catalog để xem kết quả.
Chú ý: ElasticSearch phải đang được chạy trước khi run F5. Nếu không sẽ bị báo lỗi ko có kết nối. Xem lại bài trước Cài đặt ElasticSearch với Docker để biết thêm chi tiết.


Viết code để tiến hành thêm mới dữ liệu vào ElasticSearch
     // GET: Catalog/Create  
     public ActionResult Create()  
     {  
       return View();  
     }  
     // POST: Catalog/Create  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public ActionResult Create(Catalog catalog)  
     {  
       if (ModelState.IsValid)  
       {  
         try  
         {  
           catalog.Id = Guid.NewGuid().ToString();  
           var response = _esFactory.ElasticSearchClient().Index<Catalog>(catalog, i => i  
                       .Index("catalogs")  
                       .Id(catalog.Id)  
                       .Refresh(Elasticsearch.Net.Refresh.True));  
           return RedirectToAction(nameof(Index));  
         }  
         catch  
         {  
           return View(catalog);  
         }  
       }  
       return View(catalog);  
     }  

Tiến hành Add View cho action Create với
- Template: Create
- Model class: Catalog.



View Create.cshtml được sinh ra như hình

Run F5 và thử Create New
Kết quả sau khi thêm mới dữ liệu


Viết code tương tự cho Edit action
     // GET: Catalog/Edit/5  
     public async Task<ActionResult> Edit(string id)  
     {  
       return View(await GetByIdAsync(id));  
     }  
     private async Task<Catalog> GetByIdAsync(string id)  
     {  
       return (await _esFactory.ElasticSearchClient().GetAsync<Catalog>(id, i =>   
               i.Index("catalogs"))).Source;  
     }  
     // POST: Catalog/Edit/5  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public async Task<ActionResult> Edit(int id, Catalog catalog)  
     {  
       if (ModelState.IsValid)  
       {  
         try  
         {  
           var response = await _esFactory.ElasticSearchClient().UpdateAsync<Catalog>(catalog, i => i  
                       .Index("catalogs")  
                       .Refresh(Elasticsearch.Net.Refresh.True));  
           return RedirectToAction(nameof(Index));  
         }  
         catch  
         {  
           return View(catalog);  
         }  
       }  
       return View(catalog);  
     }  

Viết code tương tự cho Delete action
     // GET: Catalog/Delete/5  
     public async Task<ActionResult> Delete(string id)  
     {  
       return View(await GetByIdAsync(id));  
     }  
     // POST: Catalog/Delete/5  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public async Task<ActionResult> Delete(string id, Catalog catalog)  
     {  
       try  
       {  
         var response = await _esFactory.ElasticSearchClient().DeleteAsync<Catalog>(id, i => i  
                 .Index("catalogs")  
                 .Refresh(Elasticsearch.Net.Refresh.True));  
         return RedirectToAction(nameof(Index));  
       }  
       catch  
       {  
         return View(catalog);  
       }  
     }  

Như vậy là chúng ta vừa hoàn tất viết một CRUD đơn giản sử dụng ASP.NET MVC kết nối đến ElasticSearch chạy trong môi trường Docker.

Source code: https://github.com/chkien0911/blog_examples/tree/master/ElasticSearchClient

Bài tiếp theo chúng ta sẽ thực hiện query đến ElasticSearch.

Cài đặt ElasticSearch với Docker

- Chạy single node cluster với Docker:
Mở CommandLine hoặc PowerShell, copy đoạn code bên dưới để pull và run ElasticSearch image trên Docker.
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.1

Note: vào trang https://www.docker.elastic.co/ để kiểm tra phiên bản mới nếu có.

Giao diện PoweShell sau khi chạy lệnh pull và run ElasticSearch docker image thành công



Để kiểm tra ElasticSearch đã được run trên Docker hay chưa, truy cập vào địa chỉ http://localhost:9200 và kiểm tra kết quả như hình bên dưới:

- Sử dụng Posman để bắt đầu kiểm tra ElasticSearch chạy trên Docker
Để index một document mới, tạo một POST request trên Posman như bên dưới:
+ Request type: POST
+ URL: localhost:9200/catalogs/_doc/1?pretty, với catalogs là index name, 1 là Id muốn tạo.
+ Body data:
{
"id": "1",
"name":"Car",
"description": "Car description"
}
Kết quả sau khi Run như hình bên dưới:


Để xem lại document vừa tạo, sử dụng Get request như bên dưới:
+ Request type: GET
+ URL: localhost:9200/catalogs/_doc/1?pretty, với catalogs là index name, 1 là Id muốn lấy dữ liệu.


Làm tương tự cho các request khác như Update, Delete...

Bài tiếp theo chúng ta sẽ ASP.NET MVC kết nối ElasticSearch chạy trên môi trường Docker

Shared to be Shared