Customer_Name、Address_Line_1、Post_Codeなどのフィールドを持つcustomerというカスタムオブジェクトがあります。
すべてのレコードを調べて、Customer_Nameの類似性を比較したいと思います(あいまい検索またはレーベンシュタイン距離に基づく)。類似度が特定のしきい値を上回っている、または下回っている場合、カスタムフィールド(Possible_Duplicate_Customer_ID__c)が更新され、重複の可能性が識別されます。
私はこれを実装することができましたが、2つの問題が発生しています:
1)。Salesforceのガバナー制限を超えています(スクリプトステートメントが多すぎます:200001)。これは、レーベンシュタイン距離アルゴリズムで必要とされる重いループが原因である可能性があります。2)。また、私がコミットしているリスト(newList)には、重複するIDが含まれています。
private static List<Customer__c> newList = new List<Customer__c>();
webService static Integer findDupes() {
Integer returnCount = 0;
Double cost = 0;
Integer COST_THRESHOLD = 5;
Map<id,Customer__c> cMap = new Map<id,Customer__c>([
select ID, Name, Customer_Name__c, Possible_Duplicate_Customer_ID__c
from Customer__c
]);
List<Customer__c> custList1 = cMap.values();
List<Customer__c> custList2 = custList1.clone();
for (Customer__c cust1 :custList1) {
for (Customer__c cust2 :custList2) {
cost = LevenshteinDistance.computeLevenshteinDistance(
cust1.Customer_Name__c, cust2.Customer_Name__c);
if(cost<COST_THRESHOLD && cost != 0) {
Customer__c c = new Customer__c(
id = cust2.Id,
Possible_Duplicate_Customer_ID__c = cust1.Name
);
newList.add(c);
}
System.debug(cost+' edits to transform '
+cust1.Customer_Name__c+' to '+cust2.Customer_Name__c);
}
}
returnCount = newList.size();
update newList;
return returnCount;
}