[Salesforce] Apex Basics & Database - SOSL 쿼리 작성하기



SOSL 쿼리 작성하기

https://trailhead.salesforce.com/content/learn/modules/apex_database/apex_database_sosl


SOSL(Salesforce Object Search Language)

  • 레코드에서 텍스트 검색을 수행하는 데 사용됨
  • Apache Lucene과 유사함
    List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS
                                        RETURNING Account(Name), Contact(FirstName,LastName)];
    


SOQL과 SOSL 비교

  • 공통점 : 레코드의 특정 정보 검색 가능
  • 차이점 : 한 번에 단일 표준/커스텀 객체만 조회할 수 있는 SOQL과 달리, SOSL은 여러 객체를 조회 가능




SOSL 기본 구문

  • 검색 기준 지정
    • 검색할 텍스트 표현
    • 검색할 필드 범위
    • 검색할 객체 및 필드 목록
    • 원본 객체에서 행을 선택하기 위한 조건
  • 와일드카드 사용 가능 (*, ?)
// Apex 에서 사용 시
FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]
        
// Query Editor, API 사용 시
FIND {SearchQuery} [IN SearchGroup] [RETURNING ObjectsAndFields]
  • SearchGroup -> 선택 사항 / 아래 값 사용 가능
    • ALL FIELDS
    • NAME FIELDS
    • EMAIL FIELDS
    • PHONE FIELDS
    • SIDEBAR FIELDS
  • ObjectsAndFields -> 선택 사항 / 지정하지 않으면 모든 객체의 ID값 포함
  • RETURNING 에 WHERE절, ORDER BY, LIMIT 사용 가능
    • RETURNING Account(Name, Industry WHERE Industry='Apparel')
    • RETURNING Account(Name, Industry ORDER BY Name)
    • RETURNING Account(Name, Industry LIMIT 10)


Single Words and Phrases

  • Single Word - 한 단어는 스페이스, 구두점(?,.,!), 문자-숫자 변환 으로 구분됨
    • The Query 조회 시 -> The와 Query가 모두 포함된 레코드 조회 (The SFDC Query Man)
  • Phrase - 큰 따옴표"로 묶인 문자열


SOSL Apex 예시

String soslFindClause = 'Wingo OR SFDC';
List<List<sObject>> searchList = [FIND :soslFindClause IN ALL FIELDS
                    RETURNING Account(Name),Contact(FirstName,LastName,Department)];
Account[] searchAccounts = (Account[])searchList[0];
Contact[] searchContacts = (Contact[])searchList[1];
System.debug('Found the following accounts.');
for (Account a : searchAccounts) {
    System.debug(a.Name);
}
System.debug('Found the following contacts.');
for (Contact c : searchContacts) {
    System.debug(c.LastName + ', ' + c.FirstName);
}




Hands-on

  • Name 일치하는 Contact/Lead 조회하기 ````java public class ContactAndLeadSearch {

    public static List<List> searchContactsAndLeads(String name) { System.debug(name); List<List> searchList = [FIND :name IN NAME FIELDS RETURNING Contact(FirstName, LastName), Lead(FirstName, LastName)];

      return searchList;   }
    

} ````

다른 글