web-dev-qa-db-ja.com

Elasticsearchの検索から重複ドキュメントを削除する

同じフィールドに同じ値を持つ大量の紙のインデックスがあります。この分野で重複排除が1つあります。

アグリゲーターはカウンターとして私のところに来ます。文書のリストが欲しいのですが。

私のインデックス:

  • Doc 1 {ドメイン: 'domain1.fr'、名前: 'name1'、日付:'01 -01-2014 '}
  • Doc 2 {ドメイン: 'domain1.fr'、名前: 'name1'、日付:'01 -02-2014 '}
  • Doc 3 {ドメイン: 'domain2.fr'、名前: 'name2'、日付:'01 -03-2014 '}
  • Doc 4 {ドメイン: 'domain2.fr'、名前: 'name2'、日付:'01 -04-2014 '}
  • Doc 5 {ドメイン: 'domain3.fr'、名前: 'name3'、日付:'01 -05-2014 '}
  • Doc 6 {ドメイン: 'domain3.fr'、名前: 'name3'、日付:'01 -06-2014 '}

私はこの結果が欲しいです(ドメインフィールドによる重複排除結果):

  • Doc 6 {ドメイン: 'domain3.fr'、名前: 'name3'、日付:'01 -06-2014 '}
  • Doc 4 {ドメイン: 'domain2.fr'、名前: 'name2'、日付:'01 -04-2014 '}
  • Doc 2 {ドメイン: 'domain1.fr'、名前: 'name1'、日付:'01 -02-2014 '}
25
Bastien D

field collapsing を使用して、nameフィールドで結果をグループ化し、top_hitsアグリゲーターのサイズを1に設定できます。

/POST http://localhost:9200/test/dedup/_search?search_type=count&pretty=true
{
  "aggs":{
    "dedup" : {
      "terms":{
        "field": "name"
       },
       "aggs":{
         "dedup_docs":{
           "top_hits":{
             "size":1
           }
         }
       }    
    }
  }
}

これは返します:

{
  "took" : 192,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "dedup" : {
      "buckets" : [ {
        "key" : "name1",
        "doc_count" : 2,
        "dedup_docs" : {
          "hits" : {
          "total" : 2,
          "max_score" : 1.0,
          "hits" : [ {
            "_index" : "test",
            "_type" : "dedup",
            "_id" : "1",
            "_score" : 1.0,
            "_source":{domain: "domain1.fr", name: "name1", date: "01-01-2014"}
          } ]
        }
      }
    }, {
      "key" : "name2",
      "doc_count" : 2,
      "dedup_docs" : {
        "hits" : {
          "total" : 2,
          "max_score" : 1.0,
          "hits" : [ {
            "_index" : "test",
            "_type" : "dedup",
            "_id" : "3",
            "_score" : 1.0,
            "_source":{domain: "domain1.fr", name: "name2", date: "01-03-2014"}
          } ]
        }
      }
    }, {
      "key" : "name3",
      "doc_count" : 2,
      "dedup_docs" : {
        "hits" : {
          "total" : 2,
          "max_score" : 1.0,
          "hits" : [ {
            "_index" : "test",
            "_type" : "dedup",
            "_id" : "5",
            "_score" : 1.0,
            "_source":{domain: "domain1.fr", name: "name3", date: "01-05-2014"}
           } ]
         }
       }
     } ]
   }
 }
}
29
Dan Tuffery