Удаление дубликатов документов из поиска в Elasticsearch

У меня есть индекс с большим количеством бумаги с одинаковым значением для одного и того же поля. У меня есть одна дедупликация на этом поле.

Агрегаторы придут ко мне в качестве счетчиков. Мне нужен список документов.

Мой индекс:

  • Документ 1 {домен: 'domain1.fr', имя: 'name1', дата: '01-01-2014'}
  • Документ 2 {домен: 'domain1.fr', имя: 'name1', дата: '01-02-2014'}
  • Документ 3 {домен: 'domain2.fr', имя: 'name2', дата: '03-01-2014'}
  • Документ 4 {домен: 'domain2.fr', имя: 'name2', дата: '04-01-2014'}
  • Документ 5 {домен: 'domain3.fr', имя: 'name3', дата: '05-01-2014'}
  • Документ 6 {домен: 'domain3.fr', имя: 'name3', дата: '06-01-2014'}

Я хочу этот результат (результат дедупликации по полю домена):

  • Документ 6 {домен: 'domain3.fr', имя: 'name3', дата: '06-01-2014'}
  • Документ 4 {домен: 'domain2.fr', имя: 'name2', дата: '04-01-2014'}
  • Документ 2 {домен: 'domain1.fr', имя: 'name1', дата: '01-02-2014'}

person Bastien D    schedule 22.08.2014    source источник
comment
Хотите найти дубликаты документов и удалить их? Или отфильтровать их из результатов поиска?   -  person Dan Tuffery    schedule 23.08.2014
comment
Я хочу отфильтровать их из результатов поиска   -  person Bastien D    schedule 23.08.2014


Ответы (1)


Вы можете использовать свертывание полей, сгруппируйте результаты в поле 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"}
           } ]
         }
       }
     } ]
   }
 }
}
person Dan Tuffery    schedule 24.08.2014
comment
Спасибо за этот ответ :-) - person Bastien D; 25.08.2014
comment
Однако, если мое значение поля похоже на «eyrolles.com/Loisirs/Livre/ couture-printemps-ete-9782756522081' мои термины моих ведер это 'printemps', 'couture', '9782756522081'... Агрегатор терминов разбивает URL по словам... Я не хочу разбивать значение . - person Bastien D; 28.08.2014
comment
Это другой вопрос, вам нужно будет проиндексировать поле not_analyzed и вместо этого ссылаться на это поле в вашей агрегации. Взгляните на типы с несколькими полями: elasticsearch.org/guide/en/elasticsearch/reference/0.90/ - person Dan Tuffery; 28.08.2014
comment
есть ли способ решить, какой из дубликатов выберет ES? скажем, у меня есть документы, которые я хочу свернуть в поле 1, но эти документы имеют разные значения поля 2, и я хочу иметь возможность произвольно выбирать, какое из них? если это поможет, в моем конкретном случае я хочу выбрать последний вставленный. - person coffeeaddict; 28.05.2015
comment
Где вы удалили документ? - person Thomas Decaux; 21.10.2016
comment
мы можем добавить условие даты? чтобы получить дубликат для определенного диапазона дат - person Jeeva N; 28.06.2017
comment
Как получить отчетливое общее количество записей при выполнении агрегации, чтобы мы могли генерировать разбиение на страницы на стороне клиента? - person Karunaker Reddy V; 18.08.2017