재우니의 블로그

이태원 참사에 대한 깊은 애도를 표합니다. 티스토리측에서도 공지했듯 이태원 참사 관련으로 콘텐츠를 생산하는분이 없기를 바랍니다.

반응형

 

 

이 문서에서는 Nest client 를 사용하여 .net 애플리케이션에서 Elastic Search 을 사용하는 방법을 보여줍니다.

developer machine 에서 Elastic 검색을 설정하는 방법과 .net 애플리케이션에서 Elastic 과 통신하는 방법을 보여드리겠습니다. 나는 기사에서 아래의 요점을 다룰 것입니다. 

  • 개발자 시스템에서 Elastic을 다운로드하고 설치하는 방법
  • .net 애플리케이션에서 통신하는 방법
  • Elastic 에서 인덱스 생성
  • 인덱스에 데이터를 삽입합니다.
  • 인덱스에서 데이터를 읽습니다. 

 

elastic search 이란 무엇입니까?

 
 
"Elasticsearch는 텍스트, 숫자, 지리 공간, 구조화 및 비구조화를 포함한 모든 유형의 데이터를 위한 분산형(distributed) 오픈 소스 검색(open source search) 및 분석 엔진(analytics engine) 입니다.
 
 
Elasticsearch는 Apache Lucene을 기반으로 하며 2010년 Elasticsearch NV(현재 Elastic으로 알려짐)에서 처음 출시되었습니다. 간단한 REST API, 분산된 특성, 속도 및 확장성으로 유명한 Elasticsearch는 데이터 수집, 강화, 저장, 분석 및 시각화를 위한 오픈 소스 도구 세트인 Elastic Stack의 핵심 구성 요소입니다. 
 
일반적으로 ELK 스택(Elasticsearch, Logstash 및 Kibana 이후)이라고 하는 Elastic Stack에는 이제 데이터를 Elasticsearch로 전송하기 위한 Beats로 알려진 다양한 경량 운송 에이전트(lightweight shipping agents) 컬렉션이 포함됩니다."
 
단계별로 시작해 보겠습니다. 먼저 개발자 머신(developer machine) 에 Elastic을 설치합니다.
 
 
 
 

developer system 에서 Elastic을 다운로드하고 설치하는 방법

  • 이 링크  Elastic Search 7.8 에서 Elastic search를 다운로드  하고 아래 단계에 따라 구성하세요. 

 

  • 위의 링크를 클릭하면 .zip 폴더에서 Elastic search를 얻을 수 있습니다. 압축을 풀고 로컬 시스템에 설치합니다.
  • 파일 추출 후 ElasticSearch.bat 파일 클릭
 
  • elasticsearch.bat 파일을 클릭하면 아래 화면과 같이 서버가 실행됩니다.
  
  • elasticsearch.bat 가 제대로 실행되지 않으면 시스템에 jdk가 설치되어 있는지 확인해야 합니다. 그렇지 않은 경우 설치해야 합니다. 여기서는 Elasticsearch.Nest 클라이언트 - 7.8 및 jdk-14.0.1을 사용했습니다.
  • Visual Studio에서 새 프로젝트를 추가하고 아래와 같이 nuget 패키지 관리자에서 Elasticsearch.Nest 참조를 추가합니다.
 
 
참조가 추가되면 Elasticsearch와 통신할 Elastic 클라이언트 커넥터를 생성해야 합니다. 아래와 같이 코드 조각을 추가했습니다.
 
 
public class ElasticSearchClient  
{  
    #region Elasticsearch Connection

    public ElasticClient EsClient()  
    {  
        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.DefaultIndex("productdetails"));  
        return elasticClient;  
    }  

    #endregion Elasticsearch Connection
}
 
 

색인에 문서를 삽입하기 위한 모델 및 컨트롤러를 추가합니다.

 

public class Products  
{  
    public int ProductId { get; set; }  
    public string ProductName { get; set; }  
    public decimal Price { get; set; }  
    public string Description { get; set; }  
    public List<CheckBoxModel> Colors { get; set; }  
    public List<CheckBoxModel> Tags { get; set; }  
}  

public class CheckBoxModel  
{  
    public int Value { get; set; }  
    public string Text { get; set; }  
    public bool IsChecked { get; set; }  
}

 

public class ProductController : Controller  
{  
   private readonly ElasticSearchClient _esClient;  

   public ProductController()  
   {  
       _esClient = new ElasticSearchClient();  
   }  
   // GET: Product  
   public ActionResult Index()  
   {  
       return RedirectToAction("Create");  
   }  
   // GET: Product/Create  
   public ActionResult Create()  
   {  
       var colors = new List<CheckBoxModel>()  
           {  
             new CheckBoxModel {Value=1,Text="Red",IsChecked=true },  
             new CheckBoxModel {Value=1,Text="Green",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="Orange",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="Blue" ,IsChecked=false},  
             new CheckBoxModel {Value=1,Text="Purple",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="Yellow" ,IsChecked=false},  
           };  
       var tags = new List<CheckBoxModel>()  
           {  
             new CheckBoxModel {Value=1,Text="Mens wear",IsChecked=true },  
             new CheckBoxModel {Value=1,Text="Ladies Wear",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="New Arraival",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="Top Brands" ,IsChecked=false},  
             new CheckBoxModel {Value=1,Text="Kids Wear",IsChecked=false },  
             new CheckBoxModel {Value=1,Text="Jeans" ,IsChecked=false},  
           };  
       var productDetails = new Products  
       {  
           Colors = colors,  
           Tags = tags  
       };  

       return View(productDetails);  
   }  

   // POST: Product/Create  
   [HttpPost]  
   public ActionResult Create(Products products)  
   {  
       try  
       {  
           var productDetail = new ProductDetails()  
           {  
               ProductId = products.ProductId,  
               ProductName = products.ProductName,  
               Price = products.Price,  
               Description = products.Description,  
               Colors = products.Colors.Where(x => x.IsChecked == true).Select(x => x.Text).ToArray(),  
               Tags = products.Tags.Where(x => x.IsChecked == true).Select(x => x.Text).ToArray()  

           };  
           // Insert product detail document to index  

           var defaultIndex = "productdetails";  
           var indexExists = _esClient.EsClient().Indices.Exists(defaultIndex);  
           if (!indexExists.Exists)  
           {  
               var response = _esClient.EsClient().Indices.Create(defaultIndex,  
                  index => index.Map<ProductDetails>(  
                      x => x.AutoMap()  
                  ));  
           }  
           var indexResponse1 = _esClient.EsClient().IndexDocument(productDetail);  

           return RedirectToAction("Create");  
       }  
       catch  
       {  
           return View();  
       }  
   }  

}

 

아래 화면을 사용하여 색인에 제품을 추가하십시오. 여기 이 화면에서 10개의 제품을 추가했습니다.

 

 

제품 추가 화면에서 삽입된 인덱스에 현재 아래의 레코드가 있습니다.

 

[{    
        "productId": 1,    
        "productName": "Shirt",    
        "price": 1000.0,    
        "description": "Shirt is made from pure cotton. Very stylish shirt specially designed for men.",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "Mens wear",    
            "New Arraival"    
        ]    
    },    
    {    
        "productId": 2,    
        "productName": "Pures",    
        "price": 1200.0,    
        "description": "Hand made purse for Women. Designed from pure leather.",    
        "colors": [    
            "Red",    
            "Green",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "New Arraival",    
            "Top Brands"    
        ]    
    },    
    {    
        "productId": 3,    
        "productName": "Jacket",    
        "price": 1300.0,    
        "description": "Jackat is made from leather. specially designed for men and womens",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Yellow"    
        ],    
        "tags": [    
            "New Arraival",    
            "Top Brands"    
        ]    
    },    
    {    
        "productId": 4,    
        "productName": "Blazer",    
        "price": 1400.0,    
        "description": "Hand made blazer which are very stylish and specially designed for man.",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Blue",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "Mens wear",    
            "Ladies Wear",    
            "New Arraival",    
            "Top Brands"    
        ]    
    },    
    {    
        "productId": 5,    
        "productName": "Jeans Top",    
        "price": 1400.0,    
        "description": "Jeans is for men and women. Very good quality material with latest design",    
        "colors": [    
            "Blue"    
        ],    
        "tags": [    
            "Mens wear",    
            "Ladies Wear",    
            "New Arraival",    
            "Jeans"    
        ]    
    },    
    {    
        "productId": 6,    
        "productName": "Girl Dresses",    
        "price": 1500.0,    
        "description": "Girl dresses and casual wears",    
        "colors": [    
            "Red",    
            "Orange",    
            "Purple"    
        ],    
        "tags": [    
            "Top Brands",    
            "Kids Wear"    
        ]    
    },    
    {    
        "productId": 7,    
        "productName": "Jumpsuits",    
        "price": 500.0,    
        "description": "Girl jumpsuit with latest design",    
        "colors": [    
            "Orange",    
            "Blue",    
            "Purple"    
        ],    
        "tags": [    
            "New Arraival",    
            "Top Brands",    
            "Kids Wear",    
            "Jeans"    
        ]    
    },    
    {    
        "productId": 8,    
        "productName": "Kurta",    
        "price": 1700.0,    
        "description": "Men traditional and designer kurta with latest design",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "Mens wear",    
            "New Arraival",    
            "Top Brands"    
        ]    
    },    
    {    
        "productId": 9,    
        "productName": "chididar",    
        "price": 1400.0,    
        "description": "Ladies chudidar dress with quality fabric.",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Blue",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "Ladies Wear",    
            "New Arraival",    
            "Top Brands"    
        ]    
    },    
    {    
        "productId": 10,    
        "productName": "Purse",    
        "price": 600.0,    
        "description": "Purse is made from pure leather. 100% pure leather is used to make this purse with great finishing.",    
        "colors": [    
            "Red",    
            "Green",    
            "Orange",    
            "Blue",    
            "Purple",    
            "Yellow"    
        ],    
        "tags": [    
            "Ladies Wear",    
            "Top Brands"    
        ]    
    }    
]

 

이제 elastic  인덱스에서 데이터 검색을 위한 코드 스니펫을 추가해 보겠습니다.

 

 

public class ProductDetails  
{  
    public int ProductId { get; set; }  
    public string ProductName { get; set; }  
    public decimal Price { get; set; }  
    public string Description { get; set; }  
    public string[] Colors { get; set; }  
    public string[] Tags { get; set; }  
}

 

 

public class SearchController : Controller  
{  
    private readonly ElasticSearchClient _esClient;  
    public SearchController()  
    {  
        _esClient = new ElasticSearchClient();  
    }  

    [HttpGet]  
    public ActionResult Search()  
    {  
        return View("Search");  
    }  
    public JsonResult DataSearch(string term)  
    {  

        var responsedata = _esClient.EsClient().Search<ProductDetails>(s => s.Source()  
                            .Query(q => q  
                            .QueryString(qs => qs  
                            .AnalyzeWildcard()  
                               .Query("*" + term.ToLower() + "*")  
                               .Fields(fs => fs  
                                   .Fields(f1 => f1.ProductName,  
                                           f2 => f2.Description,  
                                           f3 => f3.Tags,  
                                           f4 => f4.Colors  
                                           )  
                               )  
                               )));  

        var datasend = responsedata.Documents.ToList();  


        return Json(datasend, behavior: JsonRequestBehavior.AllowGet);  
    }  
}

 

  • 위의 코드에서 elastic 인덱스에서 데이터를 검색하기 위한 속성과 검색 컨트롤러가 있는 모델을 추가했습니다. ProductName, Description, Tags 및 색상의 4개 필드에 와일드카드 검색을 사용했습니다. 필드 중 하나에서 검색어를 사용할 수 있는 경우 검색 방법은 일치하는 모든 문서를 응답으로 반환합니다.
  • 이제 와일드카드를 반환할 몇 가지 용어로 검색해 보겠습니다. 탄력적 검색(예: "shirt" 라는 검색어로 검색하면 Shirt가 제품 이름에 있으므로 아래와 같이 하나의 레코드만 반환됩니다. 
     

 

이제 한 가지 예를 더 들어보겠습니다. "men"라는 용어로 검색하십시오. 이 단어는 아래 문서에 존재하므로 아래와 같이 6개의 문서를 반환합니다.

 

이제 색상 열로 검색해 보겠습니다. yellow  를 검색해 봤습니다.

 

 

"Top Brand"라는 용어가 포함된 태그 열에 대한 시나리오를 한 번 더 검색해 보겠습니다.

 

 

결론

 
이 기사에서는 developer machine 에서 Elasticsearch를 구성하는 방법, 색인을 생성하고 문서를 삽입하는 방법, 여러 필드에서 와일드카드 검색을 사용하여 데이터를 검색하는 방법에 대해 배웠습니다. 
이것은 Nest 클라이언트를 사용하여 Elasticsearch에서 와일드카드 검색의 간단한 예입니다.elastic search 에는 검색어, 필터, 분석기, 토큰화기(search queries, filters, Analyzer, Tokenizer) 등을 작성하는 데 사용할 수 있는 많은 옵션이 있습니다. 이에 대해서는 다음 기사에서 다루겠습니다.
 
번역사이트
 

WebElasticSearch.zip
13.00MB

반응형

댓글

비밀글모드