salesforce里有soql、sosl兩種查詢語法,soql針對模糊搜索也有‘like’關鍵字,然而只能針對其自帶字段如:Name、Id;對於自定義添加的字段如:Message__c、Note__c采用‘like’模糊檢索則會報錯。
然而,一般情況業務需求上更多的會對自定義字段有模糊檢索的需求,因此對此作了一些調查,然而國內salesforce並不流行,論壇博客相關討論也很少,參考了部分JP博客、官方的相關文檔,總結出兩種思路來應對自定義字段模糊檢索問題。
一、通過sosl(salesforce object search language)的find關鍵字實現
FIND ‘sear*’ IN ALL FIELDS RETURNING Table__c
思路:通過find的search語句執行得到一個模糊檢索的結果集,然后將結果集中的id取出放入集合內,再在主soql文中加入‘id in (模糊搜索記錄的id集合)’的where條件從而達到模糊查詢的目的。
if (note != null && note != '') { String findQuery = 'FIND \'' + note + '*\' IN ALL FIELDS RETURNING Test__c'; List<List<sobject>> results = search.query(findQuery); Set<Id> ids = new Set<Id>(); for(List<sobject> result: results){ for(sobject obj : result){ ids.add(obj.Id); } } string strIds = ''; Integer i = 0; for (String str : ids) { if(i != ids.size()-1) { strIds += '\''+str+'\''; strIds += ','; }else{ strIds += '\''+str+'\''; } i++; } if(strIds != null && strIds != '') { soql += ' And id IN ('+strIds+')'; }else{ soql += ' And id = '+'\'\''; } }
通過文檔說明和測試發現:
- Sosl的模糊檢索‘find’只能完成單詞、詞組以及‘hap%’這種檢索,對‘%hap%’這種無能為力;
- 示例代碼是全字段檢索(IN ALL FIELDS),按API的用法換成特定列字段檢索(IN Note__c FIELDS)會報錯,弄得人有點煩躁;
因此,綜合考慮,還是第二種方案更為可靠。
二、通過對檢索所得結果集的特定字段通過函數進行過濾實現
obj.col.contain(keyword)
思路:將soql執行得到的List集合遍歷,對各個obj的Note__c字段進行關鍵字模糊搜索過濾(contain()函數),滿足條件的添加到結果List中,最后返回結果List。
List<Test__c> temp = database.query(soql); List<Test__c> resultList = new List<Test__c>(); if(strMemo!=null&&strMemo!=''){ for(Test__c dr:temp){ if(dr.Note__c!=null&&dr.Note__c!=''){ if(dr.Msg__c.contains(strMemo)){ resultList.add(dr); } } } }else{ resultList = temp; } return resultList;
最后說下自己的看法,這種兩種方法初看起來都有點效率低下,畢竟比起sql文中like來確實費勁不少,但就實際的頁面效果來看並沒有多大時間損耗,數據量萬條以內可行性還是挺高的。