Elasticsearch는 Apache Lucene에 구축되고 JAVA 로 개발된 가장 인기 있는 무료 오픈 소스 검색 데이터베이스 중 하나입니다.HTTP 웹 인터페이스와 스키마 없는JSON문서가 포함된 분산 전체 텍스트 검색 엔진을 제공합니다.또한 Elasticsearch는JSON요청을 처리하고 JSON 데이터를 돌려주는 서버라고 할 수 있습니다.
방대한 양의 데이터를 검색하고 분석하는 데 사용할 수 있습니다.Adobe, Vimeo 및 Microsoft와 같은 유명 기업도 Elasticsearch를 사용하여 사용자에게 더 우수하고 스마트한 검색 경험을 제공합니다.
Azure및 AWS와 같은 인기 있는 클라우드 서비스 공급자 는 Elasticsearch용으로 사전 구성된 서비스를 제공합니다. 로컬 컴퓨터에서 Elasticsearch를 사용하려면 아래 링크로 다운로드할 수 있습니다 .
JAVA Virtual Machine도 컴퓨터에 설치되어 있어야 합니다.Elasticsearch zip 파일을 다운로드했으면 압축을 풀고 \bin\elasticsearch.bat 위치에서 cmd 로 실행 합니다.이 파일을 실행한 후 브라우저에 http://localhost:9200 호출합니다.
또한 이것을 Elasticsearch 서버로 사용할 수 있으며, ASP.NET Core Middleware에서 사용해야 하는 사용자 이름, 암호 및 기타 필요한 정보도 얻을 수 있습니다 .
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 에 구성하는게 좋습니다.
이제 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 사이에 매핑을 생성합니다.
이제 이 extensionElascitSearchExtension을 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 추가는 전자 상거래 사이트에서 제품을 추가하거나 업데이트할 때 문서를 추가/업데이트하는 데 사용할 수 있습니다. 대량 가져오기는 모든 제품의 인덱싱을 다시 작성하는 데 사용할 수 있습니다.
[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 대해서도 논의했습니다.