2017-11-11 7 views
1

나는 elasticsearch를 this 멋진 튜토리얼에서 배우고 있습니다. 는 'nusearch'인덱스 샘플 코드가 주어 만들려면 :ElasticSearch 색인에 특정 유형 매핑하기

 Client.CreateIndex("nusearch", i => i 
      .Settings(s => s 
       .NumberOfShards(2) 
       .NumberOfReplicas(0) 
       .Analysis(Analysis) 
      ) 
      .Mappings(m => m 
       .Map<Package>(MapPackage) 
      ) 
     ); 

이 패키지의 클래스는 "nusearch"인덱스에 저장됩니다 NEST에 알려주는 .Mappings 부분이 있습니다. 왜 그런 오류를받을 수 있나요 :

Index name is null for the given type and no default index is set. Map an index name using ConnectionSettings.MapDefaultTypeIndices() or set a default index using ConnectionSettings.DefaultIndex().' 

그런 식으로?에 인덱스 포장 할 때

 foreach (Package pack in packages) 
     { 
      Client.Index<Package>(pack); 
     } 

ConnectionSettings의의 구성에 감소 :

 _connectionSettings = new ConnectionSettings(CreateUri(9200)); 

난 왜 패키지 유형이 특정 색인에 저장되어야 ConnectionSettings 정보를 다시 추가하는 것이 궁금합니다 ? ConnectionSettings에서 특정 POCO를 매핑해야합니까? 응용 프로그램이 크고 매핑 할 수있는 유형이 많은 경우 어떻게해야합니까? 그게 어색하지 않은가? CreateIndex 메서드는 이러한 종류의 정보를 제공하는 더 나은 곳입니다.

    _connectionSettings = new ConnectionSettings(CreateUri(9200)) 
         .MapDefaultTypeIndices(m => m.Add(typeof(Package), "nusearch")) 

나 :

   .InferMappingFor<Package>(i => i 
       .TypeName("package") 
       .IndexName("nusearch")) 
      ) 

방법 InferMappingFor이 MapDefaultTypeIndices의 버전을 확장

나는 이미 그런 코드에 의해 가능하다는 것을 확인했다?

내가 알 수있는 경우 : . 유형 이름은 정확히 ElasticSearch를 의미합니까? 그것을 사용하는 가장 좋은 방법은 무엇입니까? 그것은 생략 될 때 작동하므로 검색 할 때 의미가 있다고 생각합니까?

답장을 보내 주셔서 감사합니다.

답변

1

왜 그런 오류를받을 수 있나요 :

인덱스 이름이 지정된 형태 null이며, 디폴트 인덱스가 설정되어 있지 않습니다. ConnectionSettings.DefaultIndex()를 사용하여 을 기본 색인으로 설정하거나 ConnectionSettings.MapDefaultTypeIndices()를 사용하여 색인 이름을 매핑하십시오.

그런 식으로 패키지를 색인화하려고 할 때?

오류 메시지가 표시됩니다. 요청에 대한 색인 이름이 없습니다. Elasticsearch에 문서의 색인을 생성 할 색인을 알 수 있도록 색인 이름을 제공해야합니다. NEST is able to infer an index name from a number of different places in order of precedence이므로 적어도 하나는 설정해야합니다. ConnectionSettings에 다시 패키지 유형은 특정 인덱스에 저장해야 정보를 추가 할 필요가 왜

궁금하네요?

당신은 특정 인덱스에 대한 특정 유형을 매핑에 이없는, 그러나 그렇게 꽤 일반적입니다. 그렇게하지 않기로 결정했다면, 각 요청마다 인덱스를 명시 적으로 지정하는 것이 번거롭므로 기본 인덱스를 사용하십시오. 인덱스가 서로 다른 유형의 인덱스가 여러 개있는 경우 수행하지 않을 수도 있습니다.

ConnectionSettings에서 특정 POCO를 매핑해야합니까?

아니요, 선택 사항입니다.

응용 프로그램이 크고 매핑 할 많은 유형이 있으면 어떻게됩니까? 그게 어색하지 않은가?

모든 유형을 매핑하거나 결정할 수 있습니다. 나는 POCO 타입의 규약을 ConnectionSettings에 한 번 정의하면 모든 요청에 ​​그것을 제공해야하는 것보다 덜 어색하다고 말할 수 있습니다.

CreateIndex 메서드는 이러한 종류의 정보를 제공하는 더 나은 곳입니다.

나는 동의하지 않는다. 클라이언트의 모든 사용은 인덱스를 생성하지 않을 수도 있습니다 (이미 존재할 수도 있고 다른 프로세스에서 생성 된 것일 수도 있습니다). 따라서 컨벤션 설정을 싱글 톤 구성 옵션에 연결하는 것이 좋습니다.이 옵션은 ConnectionSettings이며 사용 방법은 동일합니다.

방법 InferMappingFor는 MapDefaultTypeIndices의 확장 버전입니까? InferMappingFor<T>은 매핑 할 수 있습니다

예,

  • 인덱스 이름
  • 유형 이름
  • 속성을 무시하도록 _id
  • 속성을 사용해야합니다
  • POCO 속성이 이름을 필드에 매핑
  • Elasticsearch (단순히 POCO 속성 이름을 camelcasing하는 기본 규칙과 다른 경우). .TypeName 방법은 정확히 ElasticSearch 수단을 무엇

? 그것을 사용하는 가장 좋은 방법은 무엇입니까?

POCO에 대해 기본적으로 추론되는 것보다 다른 유형 이름 (하단 케이스 POCO 유형 이름)을 지정할 수 있습니다.