2014-11-04 2 views
7

나는 사용자가 원하는대로 구조화되어 Elasticsearch에 저장 될 문서를 작성할 수있는 API 응용 프로그램을 구축하고 있습니다. 기본적으로 사용자가 Elasticsearch 인스턴스에 액세스 할 수있는 간단한 인터페이스를 제공하고 있습니다. 구현을 가능한 한 간단하게 유지하려고합니다. 지금까지 제가 다루고있는 것이 있습니다. 예상 몸에 NEST를 사용하여 동적 객체를 색인하기

목적 :

public class DocumentModel 
{ 
    public string Index { get; set; } 
    public string Type { get; set; } 
    public string Id { get; set; } 
    [ElasticProperty(Type = FieldType.Nested)] 
    public dynamic Document { get; set; } 
} 

간단한 구현 :

[HttpPost] 
[Route("")] 
public IHttpActionResult Post(DocumentModel document) 
{ 
    Uri nodeLocation = new Uri("http://localhost:9200"); 
    IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation }); 
    ConnectionSettings settings = new ConnectionSettings(connectionPool); 
    ElasticClient esClient = new ElasticClient(settings); 

    IIndexResponse result = esClient.Index(document, i => i 
     .Index(document.Index) 
     .Type(document.Type) 
     .Id(document.Id)); 

    return Ok(result.IsValid); 
} 

소스에이 잘 작동하지만,이 색인 유형을 포함하고 ID입니다. 내가 정말로하고 싶은 것은 인덱싱 할 때 세 가지 정보를 제공하는 것뿐입니다. 실제로는 동적 인 유형의 document.Document를 인덱스로 만듭니다. 그러나 그는 IDE 및 컴파일시 에러가 발생합니다 같은 둥지에 동의하는 것 같다

"익명 함수 또는 메소드 그룹은 동적 바인딩 작업의 구성 값으로 사용할 수 없습니다"

"먼저 대리자 또는 식 트리 형식으로 캐스팅하지 않으면 람다 식을 동적으로 디스패치 된 연산의 인수로 사용할 수 없습니다."

어떻게 document.Document에 색인을 생성 할 수 있습니까? 동적 유형을 사용하는 것보다 알 수없는 구조의 들어오는 JSON 문서를 처리하는 더 좋은 방법이 있습니까?

답변

15

몇 가지 방법이 있습니다.

문서를 동적 유형으로 인덱싱하려고해도 IndexRequest 개체를 통해 개체로 인덱싱 할 수 있습니다.

dynamic dynamicDoc = new { /*fill in document format here*/ }; 
ElasticClient esClient = new ElasticClient(esSettings); 

IndexRequest<object> request = new IndexRequest<object>(dynamicDoc) 
{ 
    Index = "someindex", 
    Type = "SomeType", 
    Id = "someid" 
}; 

esClient.Index<object>(request); 

경우 또는 대량 문서

List<dynamic> Documents = new List<dynamic>(); 
//Populate Documents 

BulkDescriptor descriptor = new BulkDescriptor(); 
foreach(var doc in Documents) 
{ 
    descriptor.Index<object>(i => i 
     .Index("someindex") 
     .Type("SomeType") 
     .Id("someid") 
     .Document(doc)); 
} 

esClient.Bulk(descriptor); 

NEST 거래 (또는 더 정확하게, Elasticsearch.Net)도 ElasticClient 클래스에 부착 된 .RAW 방법의 변형을 가지고있는 수는 인덱스 원시 JSON . Raw.Index()는 우리가 이런 식으로 일을하자 사용 :

string documentJson = JsonConvert.SerializeObject(document.Document); 

ElasticsearchResponse<string> result = esClient.Raw.Index(document.Index, document.Type, document.Id, documentJson); 

응답의 형식 기술자는 응답이있을 것으로 예상됩니다 유형입니다 (문자열은 직렬화 된 JSON 응답을해야 의미 당신은 deserialize하고 함께 무언가를 할 수 있습니다.) 이렇게하면 전체 객체 유형 문제를 회피 할 수 있으며 NEST는 문서를 예상대로 Elasticsearch에 색인화합니다.

+0

새 색인 – Adrian

+0

의 이전 색인과의 부모 - 자식 관계를 유지하고 싶습니다. '동적 사전'대신 '사전 <문자열, 객체>'를 사용했거나 클래스를 상속 받았습니다. 경고 :'Dictionary'에서 상속받은 경우 NEST는 문서의 다른 속성을 자동 매핑하지 않습니다 (대신 사전에 넣음). 이는 또한 가변 속성에 대해 잘 작동했습니다 : 공통 속성은 POCO 등록 정보에 들어가고 변수 속성은'Dictionary 유형의 'Data' 등록 정보로 들어갑니다. 이 벌크 방법은 사용하기 쉽습니다. '.Errors' 등을 확인하기 위해'Bulk' 호출 결과를 얻는 것을 잊지 마십시오! – nothingisnecessary

관련 문제