2016-06-14 5 views
1

NEST 2.3.2를 사용 중입니다. 그리고 중첩 된 집계를 사용하여 쿼리를 작성하려고합니다. 기본적으로 타임 스탬프와 결과 코드가있는 로그가있는 인덱스가 있습니다. 먼저 해당 로그를 몇 분의 버킷에 넣고 결과 코드에 따라 분류합니다.중첩 집계가있는 Elasticsearch NEST 클라이언트

쿼리를 생성하는 데 다음과 같은 F # 코드가 있습니다. 내가 요청을 인쇄 할 때

/// Generate an aggregation to put buckets by result code 
let generateAggregationByResultCode() = 
    let resultAggregationName = "result_aggregation" 
    let aggregationByResults = new TermsAggregation(resultAggregationName) 
    aggregationByResults.Field <- new Field(Name = "Result") 
    aggregationByResults.ExecutionHint <- new Nullable<TermsAggregationExecutionHint>(TermsAggregationExecutionHint.GlobalOrdinals); 
    aggregationByResults.MinimumDocumentCount <- new Nullable<int>(0); 
    aggregationByResults.Size <- new Nullable<int>(bucketSize); 
    aggregationByResults.Missing <- "-128" 
    aggregationByResults 

/// Generate an aggregation to classify into buckets by minutes and then by result code 
let generateNewDateHistogramByMinute() = 
    let dateHistogramByMinute = new DateHistogramAggregation("by_minute") 
    dateHistogramByMinute.Field <- new Field(Name = "OperationTime") 
    dateHistogramByMinute.Interval <- new Union<DateInterval, Time>(DateInterval.Minute) // can also use TimeSpan.FromMinutes(1.0) 
    dateHistogramByMinute.MinimumDocumentCount <- new Nullable<int>(0) 
    dateHistogramByMinute.Format <- "strict_date_hour_minute" 
    let innerAggregations = new AggregationDictionary() 
    innerAggregations.[resultInnerAggregationName] <- new AggregationContainer(Terms = generateAggregationByResultCode()) 
    dateHistogramByMinute.Aggregations <- innerAggregations 
    dateHistogramByMinute 

내가

let dateHistogram = generateNewDateHistogramByMinute() 
let aggregations = new AggregationDictionary() 
aggregations.[histogramName] <- new AggregationContainer(DateHistogram = dateHistogram) 
(* ... code omitted ... *) 
dslRequest.Aggregations <- aggregations 

하여 요청을 설정하려면이 집계를 사용하여 집계 부분은 내부 집계가 완전히 손실이

"aggs": { 
    "BucketsByMinutes": { 
     "date_histogram": { 
     "field": "OperationTime", 
     "interval": "minute", 
     "format": "strict_date_hour_minute", 
     "min_doc_count": 0 
     } 
    } 
    } 

같다. 아무도 제대로 요청을 구성해야합니다 어떻게 알 수 있습니까? 응답이 반환되면 내부 버킷을 어떻게 검색합니까? 적절한 속성이나 메서드를 찾지 못했고 기본적으로 문서가 존재하지 않습니다.

+0

2.x 설명서는 https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/index.html에서 보았습니까? –

+0

@RussCam 솔루션을 검색하는 동안 그 점을 발견했지만 도움이되지 않았습니다. 링크 주셔서 감사합니다. – LLS

답변

1

왜 요청에 내부 집계가 표시되지 않는지 잘 모르겠습니다. 당신이

open Nest 
open Elasticsearch.Net 

type Document() = 
    member val Name = "" with get, set 

let pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")) 
let settings = new ConnectionSettings(pool, new InMemoryConnection()) 

settings.DisableDirectStreaming() 
     .PrettyJson() 
     .OnRequestCompleted(fun response -> 
      if (response.RequestBodyInBytes <> null) 
      then 
       Console.WriteLine("{0} {1} \n{2}\n", response.HttpMethod, response.Uri, Encoding.UTF8.GetString(response.RequestBodyInBytes)); 
      else Console.WriteLine("{0} {1} \n", response.HttpMethod, response.Uri); 

      if (response.ResponseBodyInBytes <> null) 
      then 
       Console.WriteLine("Status: {0}\n{1}\n{2}\n", response.HttpStatusCode, Encoding.UTF8.GetString(response.ResponseBodyInBytes), new String('-', 30)); 
      else Console.WriteLine("Status: {0}\n{1}\n", response.HttpStatusCode, new String('-', 30)); 
     ) |> ignore 

let client = new ElasticClient(settings) 

/// Generate an aggregation to put buckets by result code 
let generateAggregationByResultCode() = 
    let bucketSize = 10 
    let resultAggregationName = "result_aggregation" 
    let aggregationByResults = new TermsAggregation(resultAggregationName) 
    aggregationByResults.Field <- Field.op_Implicit("Result") 
    aggregationByResults.ExecutionHint <- new Nullable<TermsAggregationExecutionHint>(TermsAggregationExecutionHint.GlobalOrdinals); 
    aggregationByResults.MinimumDocumentCount <- new Nullable<int>(0); 
    aggregationByResults.Size <- new Nullable<int>(bucketSize); 
    aggregationByResults.Missing <- "-128" 
    aggregationByResults 

/// Generate an aggregation to classify into buckets by minutes and then by result code 
let generateNewDateHistogramByMinute() = 
    let dateHistogramByMinute = new DateHistogramAggregation("by_minute") 
    dateHistogramByMinute.Field <- Field.op_Implicit("OperationTime") 
    dateHistogramByMinute.Interval <- new Union<DateInterval, Time>(DateInterval.Minute) // can also use TimeSpan.FromMinutes(1.0) 
    dateHistogramByMinute.MinimumDocumentCount <- new Nullable<int>(0) 
    dateHistogramByMinute.Format <- "strict_date_hour_minute" 
    dateHistogramByMinute.Aggregations <- AggregationDictionary.op_Implicit(generateAggregationByResultCode()) 
    dateHistogramByMinute 

let request = new SearchRequest<Document>() 
request.Aggregations <- (AggregationDictionary.op_Implicit(generateNewDateHistogramByMinute())) 

let response = client.Search<Document>(request) 

이것을 가지고 무엇을 내가 다음에 그것을보고 있어요, 약간 수정 된 버전은 당신이 개발하는 동안

POST http://localhost:9200/_search?pretty=true 
{ 
    "aggs": { 
    "by_minute": { 
     "date_histogram": { 
     "field": "OperationTime", 
     "interval": "minute", 
     "format": "strict_date_hour_minute", 
     "min_doc_count": 0 
     }, 
     "aggs": { 
     "result_aggregation": { 
      "terms": { 
      "field": "Result", 
      "size": 10, 
      "min_doc_count": 0, 
      "execution_hint": "global_ordinals", 
      "missing": "-128" 
      } 
     } 
     } 
    } 
    } 
} 

Status: 200 
------------------------------ 

가 위 유용 할 수 있습니다 콘솔에 다음을 산출; Elasticsearch에 대해 실행할 준비가되면 ConnectionSettings 생성자에서 을 제거하고 .DisableDirectStreaming(), .PrettyJson().OnRequestCompleted(fun)에 대한 호출을 ConnectionSettings에 제거합니다.

+0

대단히 고마워요. 나는 단지'aggregations. [histogramName] <- new AggregationContainer()를'request.Aggregations <- (AggregationDictionary.op_Implicit (some_aggregation)) '로 바꿨다. 분명히 집계를'AggregationDictionary'에 직접 추가하는 것은 잘못된 방법입니다. 방금 키 항목 값이있는 일반 사전처럼 작동하고 암시 적 캐스트를 알지 못한다고 가정했습니다. – LLS

+0

'AggregationDictionary' 로의 인덱싱은 (그냥 시도해 보았 듯이) 작동해야하지만, 당신이 제공 한 이름에 대해 집계를 인덱스 할 필요가 있기 때문에 그 경로는 좀 더 성가시다. 암시 적 변환은이 작업을 수행합니다. –

+0

이유는 모르지만 두 줄을 바꾸는 것이 효과적입니다. 그리고 이제는 응답에서 내면 버킷을 얻는 데 문제가 있습니다. 응답을 일반 텍스트로 인쇄하면 프로그램을 볼 수 있지만 프로그래밍 방식으로 액세스하는 방법을 알지 못합니다. 나는 "집계"를 가지고있다 : { "BucketsByMinutes": { "items": [{... "집계": { "result_aggregation": { "items": [{ "key": "2003", "docCount" 4}, ...]}}}]}}}'고마워요. – LLS

관련 문제