2016-10-12 10 views
3

1つの記事が複数の投稿の組み合わせである記事のセットがあります。 1つの投稿はESの1つの文書です。 すべての投稿には、postId、articleId、タイムスタンプ、ステータス(簡易版)があります。 記事のステータスは、ログされた同じ記事内の最後の投稿のステータスです。 特定のステータスの記事を照会し、結果としてarticleIdのみを返したいとします。これは、articleIdをグループ化し、タイムスタンプ順に並べ替えて、結果をステータスでフィルタリングする必要があることを意味します。ElasticSearch:アグリゲーションのフィルタリングtop_hits

私はグループ化と発注を管理していますが、最後の部分にちょっと残っています。

我々のデータは、ちょっと次のようになります。私は(例えば)のための情報でarticleIDを求めるクエリを書きたい

articeid latestStatus 

1   Success 
2   Error 

:私はこれを取得、私の現在のクエリで

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 

ステータスが「エラー」のすべての記事私は、スクリプトで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

あるクエリを以下試してください。

"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 
         ] 
        } 
       ] 
       } 
      } 
     } 
    ] 

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" 
        } 
       } 
       ] 
      } 
     } 
    } 
    } 
    } 
} 

結果は次のようなものになるだろう

これがうまくいきますように!

+0

こんにちは。あなたの答えをありがとう! 私たちはすでにあなたのソリューションの変種を試しています。これは、最新のタイムスタンプのステータスに興味があるので、グループ分けの前にフィルタリングを行い、偽陽性を示します –

+0

elasticsearchにはドキュメントセレクタがないため、ソリューションが少し難解ですグループ化された/集約されたデータから削除することはできますが、スクリプト集約からいくつかの活用/回避策をとることができると考えています。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.htmlを見てください。地図を使って遊んだり、後でスクリプトを組み合わせたりしてみてください記事IDのデータをグループ化する – 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" 
      } 
     } 
     } 
    } 
    } 
} 

は、私は2つのフィルタがあり、情報でarticleIDの上に集約します。成功フィルタはstatusIdで文書をフィルタリング:1(私は成功は1を意味し、エラーがあなたのマッピングから0を意味想定している)エラーフィルタがstatusIdで文書をフィルタリングに対し:0

その後、私は、最新の処理されたタイムスタンプを探しています各フィルタと最後にバケットセレクタでは、エラータイムスタンプが成功タイムスタンプより大きいバケットのみを保持します。これにより、articleID2のバケットが1つ表示されます。

関連する問題