(通用版)salesforce中soql及sosl的偽‘Like’模糊檢索


  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 = '+'\'\'';
            }
          }

  通過文檔說明和測試發現:

  1. Sosl的模糊檢索‘find’只能完成單詞、詞組以及‘hap%’這種檢索,對‘%hap%’這種無能為力;
  2. 示例代碼是全字段檢索(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來確實費勁不少,但就實際的頁面效果來看並沒有多大時間損耗,數據量萬條以內可行性還是挺高的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM