재우니의 블로그

 

https://www.elastic.co/kr/

 

Elasticsearch 소개하기

 

Elasticsearch는 Apache Lucene에 구축되고 JAVA 로 개발된 가장 인기 있는 무료 오픈 소스 검색 데이터베이스 중 하나입니다. HTTP 웹 인터페이스와 스키마 없는 JSON 문서가 포함된 분산 전체 텍스트 검색 엔진을 제공합니다. 또한 Elasticsearch는 JSON 요청을 처리하고 JSON 데이터를 돌려주는 서버라고 할 수 있습니다. 

 

방대한 양의 데이터를 검색하고 분석하는 데 사용할 수 있습니다. Adobe, Vimeo 및 Microsoft와 같은 유명 기업도 Elasticsearch를 사용하여 사용자에게 더 우수하고 스마트한 검색 경험을 제공합니다.

 

 

 Azure 및 AWS와 같은 인기 있는 클라우드 서비스 공급자  는 Elasticsearch용으로 사전 구성된 서비스를 제공합니다. 로컬 컴퓨터에서 Elasticsearch를 사용하려면 아래 링크로 다운로드할 수  있습니다 .

 

Elasticsearch 엔진 다운로드 하기

 

https://www.elastic.co/kr/downloads/elasticsearch

 

Download Elasticsearch

Download Elasticsearch or the complete Elastic Stack (formerly ELK stack) for free and start searching and analyzing in minutes with Elastic.

www.elastic.co

 

 

 

 JAVA Virtual Machine도 컴퓨터에 설치되어 있어야 합니다. Elasticsearch zip 파일을 다운로드했으면 압축을 풀고  \bin\elasticsearch.bat  위치에서 cmd 로 실행 합니다. 이 파일을 실행한 후 브라우저에 http://localhost:9200 호출합니다.

또한 이것을 Elasticsearch 서버로 사용할 수 있으며, ASP.NET Core Middleware 에서 사용해야 하는 사용자 이름, 암호 및 기타 필요한 정보도 얻을 수 있습니다 .

 

 

\bin\elasticsearch.bat 실행한 화면

 

ASP.NET Core 프로젝트에 Elasticsearch 를 통합

 

ASP.NET Core 프로젝트에 Elasticsearch를 통합하려면 여기에서 단계별로 설명할 다양한 단계를 따라야 합니다.

ASP.NET Core 에서 Elasticsearch를 통합 하려면 NEST 패키지를 설치해야 합니다. NuGet Package Manager 또는 Package Manager Console 에서 설치할 수 있습니다 . 패키지 관리자 콘솔 에서 아래 명령을 사용할 수 있습니다.

 

PM> Install-Package NEST -Version 7.17.5

 

NEST 패키지 사용에 대해 언급했듯이 Elasticsearch.NET이 아닌 NEST 인 것에 대해 궁금할 수도 있습니다. Elasticsearch.NET 은 요청 및 응답을 작성하고 표현하는 방법에 대한 옵션이 없는 하위 수준( low-level) 의 종속성 없는(dependency-free) 클라이언트입니다.

 

따라서 NEST는 모든 요청과 응답을 매핑 가능한 이점이 있는 고급 클라이언트입니다. 강력한 형식의 쿼리 DSL을 Elasticsearch 쿼리 DSL과 매핑합니다. NEST는 내부적으로 Elasticsearch.NET 위에 구축됩니다.

 

 

 Elasticsearch Middleware 추가하기

 

NEST 패키지를 성공적으로 설치한 후 다음 단계는 Middleware 를 설정하는 것입니다. 먼저 JSON 데이터와 일치하는 속성을 보유하는 Models 폴더에 모델 클래스를 추가해 보겠습니다.

 

 

public class ArticleModel {
    public int Id {
        get;
        set;
    }
    public string Title {
        get;
        set;
    }
    public string Link {
        get;
        set;
    }
    public string Author {
        get;
        set;
    }
    public string AuthorLink {
        get;
        set;
    }
    public DateTime PublishedDate {
        get;
        set;
    }
}

 

다음은 RESTFUL 데이터를 사용하도록 Elasticsearch 인스턴스 URL을 구성하는 것입니다. 이 URL을 코드에 넣을 수도 있지만 더 나은 권장 사항은  도메인이 변경될 때마다 URL이 변경될 수 있으므로 appsettings.json 에 구성하는게 좋습니다. 

 

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
        }
    },
    "ElasticSettings": {
        "baseUrl": "https://localhost:9200/",
        "defaultIndex": "articles"
    },
    "AllowedHosts": "*"
}

 

이제 Elasticsearch 인스턴스와의 연결을 관리하기 위해 ElasticSearchExtension.cs 파일을 생성해 보겠습니다. 이 파일은 Extension 폴더 또는 프로젝트 내의 다른 위치에 있을 수 있습니다.

 

public static class ElasticSearchExtension {
    public static void AddElasticSearch(this IServiceCollection services, IConfiguration configuration) {
        var baseUrl = configuration["ElasticSettings:baseUrl"];
        var index = configuration["ElasticSettings:defaultIndex"];
        //설치한 정보에 맞게 사용자 이름, 비밀번호 및 certificate footprint 를 변경합니다.
        var settings = new ConnectionSettings(new Uri(baseUrl ?? "")).PrettyJson().CertificateFingerprint("6b6a8c2ad2bc7b291a7363f7bb96a120b8de326914980c868c1c0bc6b3dc41fd").BasicAuthentication("elastic", "JbNb_unwrJy3W0OaZ07n").DefaultIndex(index);
        settings.EnableApiVersioningHeader();
        AddDefaultMappings(settings);
        var client = new ElasticClient(settings);
        services.AddSingleton <IElasticClient> (client);
        CreateIndex(client, index);
    }
    private static void AddDefaultMappings(ConnectionSettings settings) {
    	//Link 및 AuthorLink 속성이 검색에서 제외(ignore) 한다.
        settings.DefaultMappingFor <ArticleModel> (m => m.Ignore(p => p.Link).Ignore(p => p.AuthorLink));
    }
    private static void CreateIndex(IElasticClient client, string indexName) {
    	//모델 클래스 ArticleModel 과 Elasticsearch 인스턴스의 index 사이에 매핑을 생성
        var createIndexResponse = client.Indices.Create(indexName, index => index.Map <ArticleModel> (x => x.AutoMap()));
    }
}

 

 

이 코드에서 AddElasticSearch 메소드에서 기본 옵션이 구성된 것을 확인할 수 있습니다. Elasticsearch 인스턴스 설정 중에 생성된 사용자 이름, 비밀번호 및 certificate footprint 이 여기에서 사용됩니다.

 

AddDefaultMappings 메서드에서 Link 및 AuthorLink 속성이 검색에서 무시되는 것을 볼 수 있습니다. 그리고 CreateIndex는 모델 클래스 ArticleModel 과 Elasticsearch 인스턴스의 index 사이에 매핑을 생성합니다.

 

이제 이 extension ElascitSearchExtension을 middleware 로 사용해 보겠습니다. 프로젝트에서 Program.cs 파일을 열고 아래와 같이 middleware 에 추가합니다.

 

var builder = WebApplication.CreateBuilder(args);
//extension ElascitSearchExtension을 middleware 로 사용
builder.Services.AddElasticSearch(builder.Configuration);

 

Elasticsearch 의 Documents 활용하기

 

여기에서는 Elasticsearch에서 document 를 추가하는 두 가지 방법을 제공하며, 1개 항목 추가 및 JSON 파일에서 일괄 가져오기에 대해 설명합니다. 수천 개의 제품이 있는 전자 상거래 사이트의 시나리오를 살펴보겠습니다.

 

1개씩 document 추가는 전자 상거래 사이트에서 제품을 추가하거나 업데이트할 때 문서를 추가/업데이트하는 데 사용할 수 있습니다. 대량 가져오기는 모든 제품의 인덱싱을 다시 작성하는 데 사용할 수 있습니다.

 

 

Elasticsearch 인덱스에 새로운 documents 를 추가해 보죠.
 
[추가하기]
private readonly IElasticClient _elasticClient;
private readonly IWebHostEnvironment _hostingEnvironment;
public ArticleController(IElasticClient elasticClient, IWebHostEnvironment hostingEnvironment) {
    _elasticClient = elasticClient;
    _hostingEnvironment = hostingEnvironment;
}

 

[HttpPost]
[ValidateAntiForgeryToken]
public async Task <IActionResult> Create(ArticleModel model) {
    try {
        var article = new ArticleModel() {
            Id = 1,
                Title = model.Title,
                Link = model.Link,
                Author = model.Author,
                AuthorLink = model.AuthorLink,
                PublishedDate = DateTime.Now
        };
        await _elasticClient.IndexDocumentAsync(article);
        model = new ArticleModel();
    } catch (Exception ex) {}
    return View(model);
}

 

기존 문서를 업데이트하려면 UpdateAsync 메서드를 사용할 수 있습니다.
 

[수정하기]

await _elasticClient.UpdateAsync<ArticleModel>(article.Id, u => u
    .Index("articles")
    .Doc(article))

 

문서를 삭제하려면 DeleteAsync 메서드를 사용할 수 있습니다.
 

[삭제하기]

await _elasticClient.DeleteAsync<ArticleModel>(article);

 

이 코드에서와 같이 일괄 가져오기를 수행할 수 있습니다.

 

[일괄 가져와서 저장하기]
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Import() {
    try {
        var rootPath = _hostingEnvironment.ContentRootPath; //get the root path
        var fullPath = Path.Combine(rootPath, "articles.json"); //combine the root path with that of our json file inside mydata directory
        var jsonData = System.IO.File.ReadAllText(fullPath); //read all the content inside the file
        var articleList = JsonConvert.DeserializeObject <List<ArticleModel>> (jsonData);
        if (articleList != null) {
            foreach(var article in articleList) {
                _elasticClient.IndexDocumentAsync(article);
            }
        }
    } catch (Exception ex) {}
    return RedirectToAction("Index");
}

 

 

 

이 코드는 입력 키워드를 기반으로 Elasticsearch 인스턴스에서 문서를 검색합니다.

 

[Documents 검색하기]

[HttpGet]
public ActionResult Index(string keyword) {
    var articleList = new List < ArticleModel > ();
    if (!string.IsNullOrEmpty(keyword)) {
        articleList = GetSearch(keyword).ToList();
    }
    return View(articleList.AsEnumerable());
}
public IList <ArticleModel> GetSearch(string keyword) {
    var result = _elasticClient.SearchAsync <ArticleModel> (s => s.Query(q => q.QueryString(d => d.Query('*' + keyword + '*'))).Size(5000));
    var finalResult = result;
    var finalContent = finalResult.Result.Documents.ToList();
    return finalContent;
}

 

여기에서 검색에 대한 자세한 내용을 읽을 수 있습니다. image 검색하면 결과화면은 다음과 같습니다.

 

 

 

이번 글에서는 Elasticsearch의 기본적인 소개에 대해 다루었습니다. 또한 ASP.NET Core에서 Elasticsearch Middleware Extention 추가, 추가 및 documents search  대해서도 논의했습니다. 

 

 

 

 

원문발췌

https://www.c-sharpcorner.com/article/how-to-integrate-elasticsearch-in-asp-net-core/

 

How To Integrate Elasticsearch In ASP.NET Core

This article explains basic introduction of Elasticsearch and it's integration with ASP.NET Core.

www.c-sharpcorner.com

 

 

ElasticSearch-aspcore.zip
2.43MB