SOSL 쿼리 작성
학습 목표
이 유닛을 완료하면 다음을 수행할 수 있습니다.
- SOSL이 다른 전체 텍스트 검색 대안과 다른 점을 이해할 수 있습니다.
- 기본 SOSL 구문을 식별할 수 있습니다.
- SOSL과 SOQL의 차이점을 설명할 수 있습니다.
- 여러 sObject에서 검색하는 SOSL 쿼리를 작성합니다.
SOSL은 무엇인가요?
지난 유닛에서는 SOQL을 소개하고 SOQL을 사용하여 sObject 및 관련 테이블의 데이터를 쿼리하는 방법을 설명했습니다. 여러 sObject에서 텍스트 기반 쿼리를 수행하기 위해 전체 텍스트 검색을 위한 Salesforce 옵션인 SOSL(Salesforce Object Search Language)을 사용할 수 있습니다.
.NET 개발자는 Microsoft SQL Server(MS FTS)에서 사용할 수 있는 전체 텍스트 검색 기능에 익숙할 수 있습니다. 또한 원래 Java 버전에서 C#으로 이식된 Lucene.Net이라는 인기 검색 엔진 라이브러리도 잘 알고 있을 것입니다.
좋은 소식인 동시에 나쁜 소식은 SOSL이 전체 텍스트 검색 대안과 다르다는 것입니다. 가장 큰 차이점은 인덱스를 설정하고 유지 관리하는 데 필요한 요소와 관련이 있습니다. Salesforce는 오픈 소스 검색 및 인덱싱 엔진인 Lucene을 사용하여 SOSL을 작동하지만, 설치 및 구성에 대해 걱정할 필요가 없도록 설정되었습니다. 또한 인덱스를 유지 관리할 책임도 없습니다. 실제로 대부분의 경우 여러분은 검색 인덱스가 사용되는 방식을 세세하게 제어하지 않으며, 이는 SOSL 쿼리 작성이 쉽다는 것을 의미하므로 좋은 소식입니다.
하지만 .NET 개발자는 코드를 조정하고 미세 조정하는 것을 좋아합니다. 따라서 구성과 인덱스에 대한 제어 기능이 거의 없다는 얘기를 들으면 다소 불편하게 느껴질 수 있습니다. 제어 기능이 다소 부족하더라도, SOSL 및 SOQL 쿼리 모두의 쿼리 성능을 향상하기 위한 작업을 수행할 수 있음을 보여드리려고 합니다. 이러한 방법에 대해서는 잠시 후에 자세히 다루고, 지금은 SOSL 구문이 어떻게 다른지 살펴보겠습니다.
SOSL 쿼리 작성
MS FTS에 익숙하다면 CONTAINS 또는 FREETEXT 문을 사용하는 SELECT 쿼리를 작성해야 한다는 것을 알고 있을 것입니다. 다양한 변형이 있는 강력한 CONTAINS 검색을 사용하면 완벽한 일치 또는 퍼지 일치 항목을 검색할 수 있을 뿐만 아니라, 다른 단어에 가까운 단어도 검색할 수 있습니다.
SOSL은 SOQL SELECT 키워드를 사용하지 않는 간단한 검색 구문을 사용합니다. 대신에 FIND 키워드를 사용합니다. 기본 쿼리는 다음과 같은 모습입니다.
FIND {"grand*"} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName, Email)
자세히 살펴보면 세 부분으로 구성된 것을 알 수 있습니다.
검색어가 포함된 FIND 절
FIND 절이 필요합니다. 이는 SOSL 검색의 고유한 특징입니다. FIND 뒤에는 찾으려는 검색어(단일 단어 또는 구)가 옵니다. 여기에서는 'grand'라는 단어입니다. 아래 두 예시에서와 같이 와일드카드 문자를 포함할 수도 있습니다.
* matches zero or more characters at the middle or end of the search term
?matches only one character at the middle or end of the search term
다음 유닛에서 와일드카드에 대해 더 자세히 설명하겠습니다. 하지만 검색어의 중간과 끝 모두에 와일드카드를 사용할 수 있다고 해서 반드시 사용해야 하는 것은 아닙니다. 실제로 쿼리 성능에 중대한 영향을 미칠 수 있으므로 모범 사례로서 좋은 아이디어는 아닙니다.
IN 절
IN 절을 사용하여 검색 그룹을 지정하세요. IN 절은 검색할 필드를 Salesforce에 알립니다. 여기에서 알아야 할 정말 중요한 사항이 있으므로, 끝까지 설명을 잘 들어주세요.
위의 예에서는 ALL FIELDS를 지정했습니다. 문자 그대로 받아들여서 모든 필드가 검색된다고 생각할 수 있지만, RETURNING 절에서 지정하는 개체에 따라 특정 텍스트 기반 필드만 포함됩니다. 다소 의아해하실 텐데요.
조금 전에 말했듯이 조금만 더 설명을 들어주세요. 반환하는 개체가 기사, 문서, 피드 댓글, 피드 항목, 파일, 제품 또는 솔루션인 경우 모든 필드를 검색하려는 개체 유형이기 때문에 모든 필드가 검색됩니다.
하지만 모든 종류의 비텍스트 기반 필드를 포함하는 대부분의 표준 또는 사용자 정의 개체를 검색할 때에는 이름, 이메일, 전화 및 사이드바 필드만 검색하는 것이 좋습니다. 한편, 이는 기본 동작입니다.
ALL FIELDS를 지정하지 않고, 이름 필드만 검색한다고 가정해 보겠습니다. 이 경우 NAME FIELDS를 사용합니다 전화 필드를 검색하려면 PHONE FIELDS를 사용합니다. 이제 동작 방식을 이해하셨을 것입니다.
RETURNING 절
RETURNING 절을 사용하여 반환할 데이터와 검색할 개체를 지정할 수 있습니다. 위의 예에서는 Account에서 Name 필드를 반환하고, Contact에서 Lastname, FirstName 및 Email 필드를 반환했습니다. 검색은 두 개체에 대한 모든 검색 가능한 필드를 살펴보았지만, 반환된 결과에는 괄호 안에 나열된 필드만 포함됩니다.
괄호 안에 필드 이름을 포함하지 않고 개체 이름을 지정하면 일치하는 항목이 있을 때 검색은 해당 개체의 ID만 반환합니다.
SOSL 구문에는 여러분이 관심 있어 할 만한 다른 선택적 절도 포함되어 있습니다. 이에 관한 내용은 공식 문서를 참조하세요.
자, 이제 퍼지 일치와 관련하여 SOSL이 다른 전체 텍스트 검색 엔진과 어떻게 다른지 궁금하실 것입니다. SOQL 쿼리에서 사용할 수 있는 LIKE 키워드와 SOSL 쿼리에서 사용할 수 있는 와일드카드 외에 Salesforce는 별명을 찾기 위한 동의어 검색만 제공합니다.
SOQL 또는 SOSL?
어느 것을 사용해야 할까요? 이 질문에 별로 놀라지 않으실 것입니다. 이는 성취하려는 목표에 따라 다릅니다.
단일 개체의 데이터가 필요하고 해당 개체의 기준을 아는 경우 분명 SOQL을 사용할 것입니다. 실제로 대부분의 쿼리는 SOQL에 있을 것입니다.
SOSL은 데이터가 상주하는 정확한 필드와 개체를 모르고 여러 개체에서 검색해야 하는 경우에 가장 유용합니다. SOQL은 관련 개체와만 연동되기 때문에 그러한 개체가 관련되지 않은 경우에는 더욱 그렇습니다.
SOSL 검색 실행
이제 SOSL 검색을 사용하는 이유와 방법을 알았으므로 SOSL 검색을 직접 만들어보겠습니다.
여러 가지 방법으로 SOSL 검색을 실행할 수 있지만, 지금은 Developer Console에서 쿼리 편집기를 사용할 예정입니다. 이 방법이 가장 간편합니다. SOQL에 대한 마지막 유닛에서 이 내용을 다룬 것을 기억하실 것입니다.
전제 조건
SOSL 검색을 실행하기 전에 개발 조직에 데이터를 추가해야 합니다. 먼저 개발 조직에 업로드할 수 있는 샘플 문서를 생성하세요.
- 메모장이나 텍스트 기반 편집기에서 파일을 만들고 다음 텍스트를 입력합니다.
First quarter figures were better than expected for new employee Joseph Smith.
- 파일을 TestDocument.txt라는 이름으로 로컬 컴퓨터에 저장합니다.
- Developer Edition 조직의 Files(파일) 탭에서 Upload Files(파일 업로드)를 클릭합니다.
- TestDocument.txt 파일을 저장한 위치로 이동한 후 Open(열기)을 클릭합니다.
- Done(완료)을 클릭합니다.
또한 일부 표준 개체에 데이터를 추가해야 합니다.
- Setup(설정) 메뉴에서 Developer Console을 선택하여 Developer Console을 엽니다.
- Developer Console에서 Debug(디버그) > Open Execute Anonymous Window(익명 실행 창 열기)를 선택합니다.
- 기존 코드를 삭제하고 다음 코드조각을 삽입합니다.
// Add Account and related Contact Account acct = new Account( Name='Test Account', Phone='(225)555-8989', NumberOfEmployees=10, BillingCity='Baton Rouge'); insert acct; // Get the Id of the Inserted Account ID acctID = acct.ID; // Add a contact to the Account.Contact con = new Contact( FirstName='Joseph', LastName='Smith', Phone='(225)555-8787', Email='jsmith@testaccount.com', AccountId=acctID); insert con;
- Execute(실행)를 클릭합니다.
Developer Console 사용
이제 검색할 샘플 데이터가 있으므로, 쿼리 편집기를 사용하여 새 SOSL 검색을 실행할 수 있습니다.
- Developer Console의 하단 창에서 Query Editor(쿼리 편집기) 탭을 클릭합니다.
- 기존 코드를 삭제하고 다음 코드조각을 삽입합니다.
FIND {joey} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
제일 먼저 눈에 띄는 점은 이전 예에서 검색어를 묶었던 작은따옴표가 중괄호로 대체되었다는 것입니다. 쿼리 편집기에서 SOSL 검색을 수행할 때에는 따옴표 대신 중괄호를 사용해야 합니다. 검색이 Apex 코드에서 수행된 경우에는 작은따옴표를 사용합니다. 또한 검색어가 Joseph의 알려진 별명인 'joey'라는 점에 주목하세요(우리가 찾는 실제 이름은 Joseph입니다).
- Execute(실행)를 클릭합니다. 검색 결과에는 하나의 탭만 표시됩니다. 삽입한 연락처는 Contact(연락처) 탭 아래에 나열되는데, 이는 2016년 겨울부터 제공된 별명 기능을 기반으로 일치 항목을 찾을 수 있었기 때문입니다. 하지만 별명 검색은 계정, 연락처, 리드 및 사용자 개체에만 적용되므로 업로드한 TestDocument는 나열되지 않습니다. 테스트를 수정하고 모든 결과를 반환하겠습니다.
- 쿼리 편집기에서 기존 코드를 다음으로 변경합니다.
FIND {jos*} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
- Execute(실행)를 클릭합니다.
- 이제 검색 결과에 두 개의 탭이 표시됩니다. Document(문서) 탭에는 업로드한 문서의 이름이 표시됩니다. 원하는 모든 결과를 얻기 위해 와일드카드 검색을 사용했음에 유의하세요.
추가 정보
SOSL 검색은 제한 때문에 일치하는 모든 결과를 찾지 못할 수 있습니다. Salesforce는 다중 테넌트 환경임을 기억하세요. 모든 고객이 리소스를 최대로 활용하도록 허용하면 전체 시스템이 즉시 중단됩니다. 20,000자를 초과하는 검색은 시스템에 부담을 줄 수 있습니다. 따라서 SOQL에서와 마찬가지로, SOSL에서도 검색이 제한됩니다. 다음으로는, 검색어를 최적화하는 방법에 대해 알아보겠습니다.