2016-10-12 4 views
3

하나의 기사가 여러 게시물의 조합 인 기사 모음이 있습니다. 하나의 게시물은 ES에서 하나의 문서입니다. 모든 게시물에는 postId, articleId, 타임 스탬프 및 상태 (간체 버전)가 있습니다. 기사의 상태는 기록 된 동일한 기사 내의 마지막 소식의 상태입니다. 특정 상태의 기사를 쿼리하고 결과로 articleId 만 반환하려고합니다. 즉, articleId를 그룹화하고 timestamp별로 정렬 한 다음 최종 결과를 상태별로 필터링해야합니다.ElasticSearch : 응집시 필터링 top_hits

나는 그럭저럭 할 수 있었다. 그리고 나는 주문한다. 그러나 나는 마지막 일부 위에서 다소 붙이게된다.

우리의 데이터는 다음과 같이 좀 같습니다

postid articleId timestamp    status 

1  1   01.01.2016 00:00:01  Success 
2  1   01.01.2016 00:00:03  Success 
3  1   01.01.2016 00:00:02  Error 

4  2   01.01.2016 00:00:01  Success 
5  2   01.01.2016 00:00:03  Error 
6  2   01.01.2016 00:00:02  Success 

내 현재의 쿼리로 난이 얻을 :

articeid latestStatus 

1   Success 
2   Error 

내가의은 articleID를 요청하는 쿼리를 작성하려면 (예를 들어) 상태가 '오류'인 모든 기사 내가 스크립팅 post_filter과 및 bucket_selector을 모두 사용하여 시도

GET /_search 
{  
    "size": 0,  
    "aggs": { 
     "message_status": { 
      "terms": { 
       "field": "articleId" 
      },    
      "aggs": { 
       "group_docs": { 
        "top_hits": { 
         "size": 1, 
         "sort": [ 
          { 
           "processed": { 
            "order": "desc" 
           } 
          } 
         ] 
        } 
       } 
      }    
     } 
    } 
} 

하지만 동작하지 않습니다 :

articeid 

2 

이것은 내가 지금까지 무엇을 가지고 있습니다 : 이 쿼리는 반환해야합니다.

위의 질의는이 반환

{ 
    "took": 6, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 6, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "message_status": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "1337", 
       "doc_count": 3, 
       "group_docs": { 
        "hits": { 
        "total": 3, 
        "max_score": null, 
        "hits": [ 
         { 
          "_index": "article", 
          "_type": "post", 
          "_id": "3", 
          "_score": null, 
          "_source": { 
           "postId": 3, 
           "articleId": "1337", 
           "processed": "2016-10-10T12:47:25.570852+02:00", 
           "statusId": 6 
          }, 
          "sort": [ 
           1476096445570 
          ] 
         } 
        ] 
        } 
       } 
      }, 
      { 
       "key": "42", 
       "doc_count": 3, 
       "group_docs": { 
        "hits": { 
        "total": 3, 
        "max_score": null, 
        "hits": [ 
         { 
          "_index": "article", 
          "_type": "post", 
          "_id": "6", 
          "_score": null, 
          "_source": { 
           "postId": 6, 
           "articleId": "42", 
           "processed": "2016-10-10T13:02:59.399726+02:00", 
           "statusId": 5 
          }, 
          "sort": [ 
           1476097379399 
          ] 
         } 
        ] 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

은 내가 지금 달성하고자하는 특정 statusId에이 응답을 필터링 만 articleIds을 반환하는 것입니다.

대단히 감사합니다!

가 업데이트 : 여기

{ 
    "article": { 
     "mappings": { 
     "post": { 
      "properties": {    
       "articleId": { 
        "type": "string" 
       },    
       "postId": { 
        "type": "integer" 
       }, 
       "processed": { 
        "type": "date", 
        "format": "strict_date_optional_time||epoch_millis" 
       }, 
       "statusId": { 
        "type": "integer" 
       } 
      } 
     } 
     } 
    } 
} 
+0

인덱스의 매핑을 공유하십시오. – Richa

+0

솔루션이 작동 했습니까? – ChintanShah25

답변

0

다음 쿼리를 시도하십시오 내 매핑 :

GET article/_search 
{ 
"size": 0, 
"query": { 
    "term": { 
    "status": { 
     "value": "error" 
    } 
    } 
}, 
"aggs": { 
    "group By articls": { 
    "terms": { 
     "field": "articleId" 
    }, 
    "aggs": { 
     "top hits": { 
      "top_hits": { 
       "size": 1, 
       "_source" :["articleId"], 
       "sort": [ 
       { 
        "timestamp": { 
         "order": "desc" 
        } 
       } 
       ] 
      } 
     } 
    } 
    } 
    } 
} 

결과가 될 것 같은 뭔가 :

"buckets": [ 
     { 
      "key": 2, 
      "doc_count": 1, 
      "top hits": { 
       "hits": { 
       "total": 1, 
       "max_score": null, 
       "hits": [ 
        { 
         "_index": "article", 
         "_type": "article", 
         "_id": "3", 
         "_score": null, 
         "_source": { 
          "articleId": 2 
         }, 
         "sort": [ 
          1444435200000 
         ] 
        } 
       ] 
       } 
      } 
     } 
    ] 

희망이 도움이됩니다!

+0

안녕하세요. 답변 주셔서 감사합니다! 우리는 이미 귀하의 솔루션 변형을 시도해 보았습니다. 우리가 최신 타임 스탬프를 가지고있는 상태에 관심이 있기 때문에 이것은 그룹핑 전에 필터링을합니다. 우리는 false positive를줍니다. –

+0

elasticsearch에는 문서 선택기가 없으므로 해결책이 약간 까다 롭습니다. 그룹화 된/집계 된 데이터에서 가져 오지 만, 스크립트 집계를 활용할 수 있다고 생각합니다. 그들에게 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html을보십시오.지도로 놀고, 감소시키고, 결합한 후에 원본을보십시오 – user3775217

+0

네, 스크립트 메트릭 집계를 자세히 살펴 봤는데, 당신이 그들과 함께 놀고 나서 당신이 찾고있는 것을 얻을 수 있다고 생각합니다. – user3775217

0

나는 bucket selector aggregation가 원하는 결과를 줄 것이라고 생각합니다. 이것은 두 개의 필터

{ 
    "size": 0, 
    "aggregations": { 
    "user_terms": { 
     "terms": { 
     "field": "articleId" 
     }, 
     "aggs": { 
     "error_filter": { 
      "filter": { 
      "term": { 
       "statusId": 0 
      } 
      }, 
      "aggs": { 
      "latest_processed_timestamp": { 
       "max": { 
       "field": "processed" 
       } 
      } 
      } 
     }, 
     "success_filter": { 
      "filter": { 
      "term": { 
       "statusId": 1 
      } 
      }, 
      "aggs": { 
      "latest_processed_timestamp": { 
       "max": { 
       "field": "processed" 
       } 
      } 
      } 
     }, 
     "only_error_filter": { 
      "bucket_selector": { 
      "buckets_path": { 
       "error_timestamp": "error_filter.latest_processed_timestamp", 
       "success_timestamp": "success_filter.latest_processed_timestamp" 
      }, 
      "script": "error_timestamp > success_timestamp" 
      } 
     } 
     } 
    } 
    } 
} 

는 처음에, 나는 은 articleID을 통해 집계 쿼리가 있습니다.성공 필터는 statusId으로 문서를 필터링 : 1 (내가 가정 한 성공은 한 의미 및 오류가 당신의 매핑에서 0을 의미) 오류 필터 반면 statusId와 문서 필터 : 나는 최신 처리 타임 스탬프를 발견하고 그 후 0

을 각 필터 및 마지막으로 버킷 선택기에서 오류 타임 스탬프가 성공 타임 스탬프보다 큰 버킷 만 보유합니다. 그러면 articleId 2가 포함 된 하나의 버킷이 생깁니다.

관련 문제