>  기사  >  백엔드 개발  >  C#에서 ES를 사용하는 방법

C#에서 ES를 사용하는 방법

高洛峰
高洛峰원래의
2017-02-08 13:32:012118검색

Elasticsearch 소개

Elasticsearch(ES)는 Lucene 기반의 오픈 소스 검색 엔진으로, 안정적이고 안정적일 뿐만 아니라 수평 확장성도 뛰어납니다. .

Elasticsearch란 무엇입니까

Elasticsearch는 Apache Lucene(TM)을 기반으로 하는 오픈 소스 검색 엔진으로, 오픈 소스 분야에서든 독점 분야에서든 Lucene은 가장 발전되고 성능이 뛰어난 것으로 간주될 수 있습니다. 현재까지 가장 포괄적인 검색 엔진 라이브러리입니다.
그러나 Lucene은 단지 라이브러리일 뿐입니다. 이 기능을 활용하려면 C#을 사용하여 애플리케이션에 통합해야 합니다. Lucene은 매우 복잡하며 작동 방식을 이해하려면 검색에 대한 깊은 이해가 필요합니다.
Elasticsearch도 Java로 작성되었으며 Lucene을 사용하여 인덱스를 구축하고 검색 기능을 구현하지만, 그 목적은 간단하고 일관된 RESTful API를 통해 전체 텍스트 검색을 간단하게 만들고 Lucene의 복잡성을 숨기는 것입니다.
그러나 Elasticsearch는 Lucene과 전체 텍스트 검색 엔진 그 이상이며 다음 기능도 제공합니다.

분산 실시간 파일 저장소, 모든 필드가 색인화되고 검색 가능

실제 시간 분석 분산 검색 엔진

은 수백 대의 서버로 확장할 수 있으며 페타바이트 규모의 정형 또는 비정형 데이터를 처리할 수 있습니다.

또한 이러한 모든 기능은 하나의 서버에 통합되어 있으므로 애플리케이션은 다음을 통해 상호 작용할 수 있습니다. 간단한 RESTful API, 다양한 언어의 클라이언트, 심지어 명령줄까지. Elasticsearch를 시작하는 것은 쉽고, 많은 합리적인 기본값을 제공하며, 초보자에게 복잡한 검색 엔진 이론을 숨깁니다. 즉시 사용 가능하며(설치되어 즉시 사용 가능) 프로덕션 환경에서 사용하려면 최소한의 학습이 필요합니다. Elasticsearch는 Apache 2 라이선스에 따라 라이선스가 부여되며 무료로 다운로드, 사용 및 수정할 수 있습니다.
지식이 쌓이면 다양한 문제 영역에 따라 Elasticsearch의 고급 기능을 맞춤 설정할 수 있습니다. 이 모든 것은 구성이 가능하며 구성이 매우 유연합니다.

C#을 사용하여 ES 운영

NEST는 모든 요청 및 응답 개체를 매핑할 수 있고 강력한 형식의 쿼리 DSL(도메인 특정 언어)을 가지며 .net을 사용할 수 있는 고급 클라이언트입니다. 공분산 및 POCO 자동 매핑과 같은 기능은 NEST가 여전히 내부적으로 Elasticsearch.Net 클라이언트를 사용합니다. elasticsearch.net(NEST) 클라이언트는 사용자 편의를 위해 강력한 형식의 쿼리 DSL을 제공합니다. 소스 코드를 다운로드할 수 있습니다.

1. NEST 설치 방법

NuGet 패키지 관리자 콘솔을 통해 VS의 도구 메뉴를 열고 다음 명령을 입력하여 NEST

Install-Package NEST

설치 후 다음 3개의 DLL이 참조됩니다

Elasticsearch.Net.dll(2.4.4) Nest.dll(2.4.4) Newtonsoft.Json.dll(9.0 버전)

2. Elasticsearch 연결

연결 풀을 사용하여 단일 노드를 통해 Elasticsearch 클러스터에 연결하거나 여러 노드를 지정할 수 있습니다. 로드 밸런싱, 장애 조치 등을 지원하는 Elasticsearch에 대한 단일 노드.

단일 링크 사용:

var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);

연결 풀을 통한 링크:

var node = new Uri[]

{

new Uri("http ://myserver1:9200"),

new Uri("http://myserver2:9200"),

new Uri("http://myserver3:9200")

};


var pool = new StaticConnectionPool(노드);

var settings = new ConnectionSettings(pool);

var client = new ElasticClient(settings);

NEST Index

요청이 어떤 인덱스에서 작동해야 하는지 알기 위해 Elasticsearch API는 하나 이상의 인덱스 이름을 일부로 수신할 것으로 예상합니다. 요청의.

1. 인덱스 지정

1. ConnectionSettings를 통해 .DefaultIndex()를 사용하여 기본 인덱스를 지정할 수 있습니다. 요청에 특정 인덱스가 지정되지 않은 경우 NEST는 기본 인덱스를 요청합니다.

var settings = new ConnectionSettings()
.DefaultIndex("defaultindex");

2. ConnectionSettings를 통해 .MapDefaultTypeIndices()를 사용하여 CLR 유형에 매핑된 인덱스를 지정할 수 있습니다.

var settings = new ConnectionSettings()
.MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects")
);

참고: .MapDefaultTypeIndices()를 통해 인덱스를 지정하는 것은 .DefaultIndex()를 통해 인덱스를 지정하는 것보다 우선순위가 높으며 단순 개체(POCO)에 더 적합합니다.

3. 또한 요청에 대한 인덱스 이름을 명시적으로 지정할 수도 있습니다. 예:

var response = client.Index(student, s=>s.Index("db_test") );
var result = client.Search(s => s.Index("db_test"));
var result = client.Delete(null, s => s. Index("db_test" ));

참고: 실제로 요청에 대한 인덱스 이름을 지정할 때 이 우선순위는 위의 두 가지 방법으로 지정한 인덱스보다 가장 높습니다.

4. 일부 Elasticsearch API(예: 쿼리)는 하나 이상의 인덱스 이름을 사용하거나 _all 특수 플래그를 사용하여 NEST의 여러 노드 또는 모든 노드에 요청을 보낼 수 있습니다.

//단일 노드 요청

var SingleString = Nest.Indices.Index("db_studnet");

var SingleTyped = Nest.Indices.Index();


ISearchRequest SingleStringRequest = 새 SearchDescriptor().Index(singleString);

ISearchRequest SingleTypedRequest = 새 SearchDescriptor().Index(singleTyped);


//여러 노드 요청

var ManyStrings = Nest.Indices.Index("db_studnet", "db_other_student");

var ManyTypes = Nest .Indices. Index().And();


ISearchRequest ManyStringRequest = new SearchDescriptor().Index(manyStrings);

ISearchRequest ManyTypedRequest = new SearchDescriptor().Index(manyTypes);


//모든 노드 요청

var indicesAll = Nest .Indices. All;

var allIndices = Nest.Indices.AllIndices;


ISearchRequest indicesAllRequest = new SearchDescriptor().Index(indicesAll) ;

ISearchRequest allIndicesRequest = new SearchDescriptor().Index(allIndices);


2. 인덱스 생성

Elasticsearch API를 사용하면 다음을 수행할 수 있습니다. 인덱스를 생성하는 동안 인덱스를 구성합니다. 예:

var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1) );
client.CreateIndex(descriptor);

인덱스의 샤드 수는 5개, 복사본 수는 1개로 지정합니다.

3. 인덱스 삭제

Elasticsearch API를 사용하면 인덱스를 삭제할 수 있습니다. 예:

var descriptor = new DeleteIndexDescriptor("db_student").Index("db_student") ;
client.DeleteIndex(descriptor)

삭제할 인덱스 이름 "db_student"가 여기에 지정됩니다. 추가 삭제 사용 사례는 다음과 같습니다.

/ /지정된 인덱스 삭제
노드 아래의 모든 인덱스 var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();

NEST 매핑

NEST는 다양한 매핑 방법을 제공합니다. 여기에 소개된 속성 사용자 정의 매핑입니다.

1. 간단한 구현

1. 비즈니스에서 요구하는 POCO를 정의하고 필수 속성을 지정합니다

[ElasticsearchType(Name = "student")]

공개 수업 학생

{

[Nest.String(Index = FieldIndexOption.NotAnalyzed)]

공개 문자열 Id }


[Nest.String(Analyzer = "standard")]

공개 문자열 이름 { get; set; 🎜 > [Nest.String(Analyzer = "standard")]

공개 문자열 설명 { get; set }

public DateTime DateTime { get; set }

}

2. 그런 다음 .AutoMap()을 사용하여 매핑을 구현합니다.

var descriptor = new CreateIndexDescriptor("db_student")

. 설정(s => s.NumberOfShards(5).NumberOfReplicas(1))

.Mappings(ms => ms

.Map(m => m .AutoMap())

);

client.CreateIndex(descriptor);

참고: .Properties( ) Attribute

에 의해 정의된 매핑 2. Attribute 소개

1. StringAttribute

2. NumberAttribute

C#에서 ES를 사용하는 방법

3. BooleanAttribute

C#에서 ES를 사용하는 방법

4. DateAttribute

C#에서 ES를 사용하는 방법

5.

NEST 검색

NEST는 Lambda 체인 쿼리 DLS(도메인 특정 언어)를 지원합니다. 다음은 간단한 구현과 각 쿼리에 대한 간략한 설명입니다.

1. 간단한 구현

1. 프로젝트에서 복잡한 비즈니스 구현을 용이하게 하기 위해 SearchDescriptor를 정의합니다.

var query = new Nest.SearchDescriptor() ;
var result = client.Search(x => query)

2. 제목과 내용에 키가 포함되어 있고 작성자가 "Pretty Girl"과 같지 않은 문서를 검색합니다.

query.Query(q =>

q.Bool(b =>

) b.Must(m =>

MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content)).Query(key))

)

.MustNot(m =>

m.QueryString(t => t.Fields(f => f.Field(obj => obj.Author) )). 쿼리("wenli"))

)

)

);

참고:

Elasticsearch가 기본 단어 분할을 사용하는 경우 Title 및 Content의 속성은 [Nest.String(Analyzer = "standard")]

Elasticsearch가 IK 단어 분할을 사용하는 경우 Title 및 Content의 속성은 다음과 같습니다. [Nest.String(Analyzer = "ikmaxword")] 또는 [Nest.String(Analyzer = "ik_smart")]

작성자 속성은 [Nest.String(Index = FieldIndexOption.NotAnalyzed)]이며 사용 분석기

3. 작성자가 "Historical River"

query.PostFilter(x => x.Term(t => t.Field(obj)인 문서 필터링 => obj.Author).Value(" wenli")));


4. 작성자가 "Historical River" 또는 "Friendship Boat"와 동일한 문서를 필터링하고 여러 항목을 일치시킵니다. 공백으로 구분된 작성자

query .PostFilter(x => x.QueryString(t => t.Fields(f =>


5. 1에서 100 사이의 숫자로 문서 필터링

query.PostFilter(x => x.Range(t => t.Field(obj => obj.Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));


6. 점수 플래시백에 따라 정렬

query.Sort(x = > query.Highlight(h => h

.PreTags( "")

.PostTags("")


.Fields(

f => f.Field(obj => ; obj.Title),

f => f.Field(obj => obj.Content),

f => f.Field("_all")

)

);

8. 쿼리 내용 취합, 데이터 정리, 이전 호출 촉진

var list = result.Hits.Select(c => new Models.ESObject()

{

Id = c.Source .Id,


Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights["title "].Highlights): c.Source.Title, // 강조 표시된 콘텐츠가 레코드에 여러 번 나타납니다.

Content = c.Highlights == null ? c.Source.Content: c.Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c.Source.Content, //강조된 내용, 레코드에 나타나는 횟수 Times

Author = c.Source.Author,

숫자 = c.Source.Number,

IsDisplay = c.Source.IsDisplay,

태그 = c.Source.Tags,

댓글 = c.Source. 댓글,

DateTime = c.Source.DateTime,

})

2. DSL 쿼리 소개

정리...

elasticsearch.net 문서

문서 작업에는 문서 추가/업데이트, 문서 부분 업데이트, 문서 삭제 및 해당 일괄 작업 문서 방법이 포함됩니다.

1. 문서 추가/업데이트 및 일괄 작업

단일 문서 추가/업데이트


Client.Index(student);

일괄 작업 문서 추가/업데이트

var list = new List();2 3 client.IndexMany(list);

2. 단일 문서 부분 업데이트 및 일괄 작업

단일 문서 부분 업데이트

client.Update("002", upt => upt.Doc(new { Name = "wenli" }));

일괄 문서 부분 업데이트

var ids = new List() { "002" };


varbulkQuest = new BulkRequest() { Operations = new List() };


foreach(var v in ids)

{

var 작업 = new BulkUpdateOperation(v);


작업.Doc = new { 이름 = "wenli" };


bulkQuest.Operations.Add(작업);

}


var 결과 = client.Bulk(bulkQuest );


3. 문서 삭제 및 일괄 작업

단일 문서 삭제

client.Delete("001" );

문서 일괄 삭제

var ids = new List() { "001", "002" };


varbulkQuest = new BulkRequest() { Operations = new List() };


foreach(var v in ids)

{

bulkQuest.Operations.Add(new BulkDeleteOperation(v));

}


var 결과 = client.Bulk (bulkQuest);

C#에서 ES를 사용하는 방법과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.