Нечеткая логика / сопоставление названия компании (лиды)

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

До сих пор я создал следующий апекс. В настоящее время apex просматривает название компании в лиде, и если в базе данных есть точное совпадение с названием другой компании, он предоставляет пользователю сообщение об ошибке «другой новый лид имеет такое же название компании».

Это здорово, если название компании точное, однако мне нужно, чтобы оно было более гибким.

Например, если лид «Burger King Limited» был создан в 2012 году, а продавец решил создать лид под названием «Burger King LTD» в 2013 году, это та же компания, что и лид, созданный в 2012 году.

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

Trigger DuplicateLeadPreventer on Lead
                               (before insert, before update) {

//Get map of record types we care about from Custom Setting
 Map<String, Manage_Lead_Dupes_C__c> leadrtmap = Manage_Lead_Dupes_C__c.getAll();




 //Since only certain leads will match, put them in a separate list
 List<Lead> LeadstoProcess = new List<Lead> ();

 //Company to Lead Map
 Map<String, Lead> leadMap = new Map<String, Lead>();

    for (Lead lead : Trigger.new) {

     //Only process for Leads in our RecordTypeMap
         if (leadrtmap.keyset().contains(lead.RecordTypeId) ) {

        // Make sure we don't treat an Company name that 
       // isn't changing during an update as a duplicate. 

              if (
                 (lead.company != null) &&
                 (Trigger.isInsert ||
                 (lead.company != Trigger.oldMap.get(lead.Id).company))
                 ) 
                 {

                    // Make sure another new lead isn't also a duplicate 

                        if (leadMap.containsKey(lead.company)) {
                            lead.company.addError('Another new lead has the '
                                            + 'same company name.');
                        } else {
                            leadMap.put(lead.company , lead);
                            LeadstoProcess.add(lead);
                        }
                }
    } //end RT If Check
    } //End Loop

    /*
     Using a single database query, find all the leads in 
     the database that have the same company address as any 
     of the leads being inserted or updated. 

   */

    Set<String> ExistingCompanies = new Set<String> ();

            for (Lead l: [Select Id, Company from Lead WHERE Company IN :leadMap.keyset()
                             AND RecordTypeId IN :leadrtmap.keyset()]) {
                          ExistingCompanies.add(l.Company);
                }

    //Now loop through leads to process, since we should only loop if matches
    for (Lead l : LeadstoProcess) {
        if (ExistingCompanies.contains(l.company) ) {
             l.company.addError('A lead with this company '
                               + 'name already exists.');
        }
    }
}

person Masond3    schedule 16.04.2013    source источник