web-dev-qa-db-fra.com

Supprimer les documents en double d'une recherche dans Elasticsearch

J'ai un index avec beaucoup de papier avec la même valeur pour le même champ. J'ai une déduplication sur ce domaine.

Les agrégateurs viendront à moi comme compteurs. Je voudrais une liste de documents.

Mon index:

  • Doc 1 {domaine: 'domain1.fr', nom: 'name1', date: '01 -01-2014 '}
  • Doc 2 {domaine: 'domain1.fr', nom: 'name1', date: '01 -02-2014 '}
  • Doc 3 {domaine: 'domain2.fr', nom: 'name2', date: '01 -03-2014 '}
  • Doc 4 {domaine: 'domain2.fr', nom: 'name2', date: '01 -04-2014 '}
  • Doc 5 {domaine: 'domain3.fr', nom: 'name3', date: '01 -05-2014 '}
  • Doc 6 {domaine: 'domain3.fr', nom: 'name3', date: '01 -06-2014 '}

Je veux ce résultat (résultat de déduplication par champ de domaine):

  • Doc 6 {domaine: 'domain3.fr', nom: 'name3', date: '01 -06-2014 '}
  • Doc 4 {domaine: 'domain2.fr', nom: 'name2', date: '01 -04-2014 '}
  • Doc 2 {domaine: 'domain1.fr', nom: 'name1', date: '01 -02-2014 '}
25
Bastien D

Vous pouvez utiliser réduction du champ , regrouper les résultats dans le champ name et définir la taille du top_hits agrégateur à 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
           }
         }
       }    
    }
  }
}

cela renvoie:

{
  "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