Статьи

Хотите избавиться от документов с дублированным контентом?

Комбинируете ли вы данные из двух разных источников данных, совершаете ли вы несколько покупок у одного и того же клиента или просто вводите одни и те же данные в веб-форму дважды, похоже, что в тот или иной момент все сталкиваются с проблемой дублирования данных.

В этом сообщении мы рассмотрим использование представлений в Couchbase Server 2.0 для поиска подходящих полей среди документов и сохранения неповторяющихся документов. В этом примере предположим, что в каждом документе есть три общих поля, указанных пользователем — first_name , last_name , postal_code . Используя клиент ruby для Couchbase Server и фейкерный ruby gem, вы можете создать простой генератор данных для загрузки образцов дубликатов данных в Couchbase. Чтобы использовать ruby ​​в качестве языка программирования с Couchbase, вы должны загрузить Ruby SDK здесь .

Вот пример выполнения:

$ ruby ./generate.rb --help
Usage: generate.rb [options]
   -h, --hostname HOSTNAME           Hostname to connect to (default: 127.0.0.1:8091)
   -u, --user USERNAME               Username to log with (default: none)
   -p, --passwd PASSWORD            Password to log with (default: none)
   -b, --bucket NAME                 Name of the bucket to connect to (default: default)
   -t, --total-records NUM           The total number of the records to generate (default: 10000)
   -d, --duplicate-rate NUM          Each NUM-th record will be duplicate (default: 30)
   -?, --help                        Show this message

$ ruby ./generate.rb -t 1000 -d 5
     1000 / 1000
Каждый документ в Couchbase имеет указанный пользователем ключ, который доступен как
meta.id
в функции map представления. На рисунке 1 ниже, есть несколько документов, загруженных на Couchbase Server с использованием клиента генератора данных выше.
 
 

 

Шаг 1

Написать пользовательскую функцию карты, испускающую идентификатор документа ( meta.id ) все документы , если ОПРЕДЕЛЕННАЯ дублирующий шаблон спичка ( first_name , last_name , postal_code в данном случае).
function (doc, meta) {

      emit([doc.first_name + '-' + doc.last_name + '-' +  doc.postal_code], meta.id);
}
Функция карты определяет, когда два документа являются дубликатами. Согласно функции карты, определенной выше, два документа дублируются, когда совпадают имя, фамилия и почтовый индекс. Мы используем ‘-‘, чтобы не допускать совмещения данных при объединении имени, фамилии и почтового индекса.
 
 

 

Шаг 2

Функция уменьшения выглядит как —

function (keys, values, rereduce) {
  if (rereduce) {
    var res = [];
    for (var i = 0; i < values.length; i++){
      res = res.concat(values[i])
    }
    return res;
  } else {
    return values;
  }
}

После группировки, если имеется несколько значений meta.id, мы объединяем их, чтобы получить список ссылок meta.id на дубликат документа.

Шаг 3

Основная часть очистителя данных написана на Ruby.
require 'couchbase'
 
connection = Couchbase.connect(options)
ddoc = connection.design_docs[options[:design_document]]
view = ddoc.send(options[:view])
connection.run do
 view.each(:group => true) do |doc|
   dup_num = doc.value.size
   if dup_num > 1
      puts "left doc #{doc.value[0]}, "
      # delete documents from second to last
       connection.delete(doc.value[1..-1])
      puts "removed #{dup_num} duplicate(s)"
   end
 end
end
Подключитесь к Couchbase Server и запросите представление. Поле значения представляет собой массив meta.id, которые соответствуют дубликатам документов (соответствуют имени, фамилии и почтовому индексу). Если размер массива больше 1, мы удаляем все документы, кроме того, который соответствует последнему meta.id.

Если число meta.id в массиве значений больше 2, существуют дубликаты документов, соответствующие этому ключу. Как показано на рисунке выше, id19 и id20 являются дубликатами документов.

Вывод скрипта очистки данных выглядит так:
 
Как показано на рисунке ниже, дубликаты документов теперь удаляются.

Наслаждайтесь!