Skip to main content
From 16:00 UTC on January 17, 2026, to 20:00 UTC on January 17, 2026, we will perform planned maintenance on the Trailhead, myTrailhead, and Trailblazer Community sites. During the maintenance, these sites will be unavailable, and users won't be able to access them. Please plan your activities around this required maintenance.

编写 SOSL 查询

学习目标

完成本单元后,您将能够:

  • 描述 SOSL 和 SOQL 之间的差异。
  • 使用 SOSL 查询跨多个对象搜索字段。
  • 使用 Developer Console 中的查询编辑器执行 SOSL 查询。
备注

备注

用中文(简体)学习?在中文(简体)Trailhead Playground 中开始挑战,用括号中提供的译文完成挑战。仅复制并粘贴英文值,因为挑战验证基于英文数据。如果在中文(简体)组织中没有成功通过挑战,我们建议您 (1) 将区域设置切换为美国,(2) 按此处说明将语言切换为英文,(3) 再次单击“检查挑战”按钮。

查看 Trailhead 本地化语言徽章详细了解如何利用 Trailhead 译文。

SOSL 入门

Salesforce 对象搜索语言 (SOSL) 是一种 Salesforce 搜索语言,用于在记录中执行文本搜索。使用 SOSL 在 Salesforce 中跨多个标准和自定义对象记录搜索字段。SOSL 类似于 Apache Lucene。

向 Apex 添加 SOSL 查询非常简单 — 您可以直接在您的 Apex 代码中嵌入 SOSL 查询。当 SOSL 嵌入到 Apex 中时,它被称为内嵌式 SOSL

这是 SOSL 查询的一个示例,该查询用于搜索包含 "SFDC"一词的任何字段的客户和联系人。

List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS
                                      RETURNING Account(Name), Contact(FirstName,LastName)];

SOQL 与 SOSL 的差异与相似性

与 SOQL 一样,SOSL 允许您搜索组织的记录以获取特定信息。与一次只能查询一个标准或自定义对象的 SOQL 不同,单个 SOSL 查询可以搜索所有对象。

另一个区别是 SOSL 基于单词匹配的方式来匹配字段,而默认情况下即便不使用通配符,SOQL 仍然执行精确匹配。例如,在 SOSL 中搜索 "Digital" 会返回字段值为 "Digital" 或 "The Digital Company" 的记录,但 SOQL 只返回字段值为 "Digital" 的记录。

SOQL 和 SOSL 是两种不同语法的独立语言。每种语言都有一个独特的用例:

  • 使用 SOQL 检索单个对象的记录。
  • 使用 SOSL 跨多个对象搜索字段。SOSL 查询可以搜索对象上的大多数文本字段。

先决条件

本单元中部分查询示例的前提是组织内已存在客户和联系人。如果您在 SOQL 单元中未创建过示例数据,请在本单元创建示例数据。如果已创建,则可以跳过在本部分中创建示例数据的步骤。

  1. 从 Developer Console 的 Debug(调试)菜单中打开 Execute Anonymous(执行匿名)窗口。
  2. 在窗口中插入以下片段,然后单击 Execute(执行)
// Add account and related contact
Account acct = new Account(
    Name='SFDC Computing',
    Phone='(415)555-1212',
    NumberOfEmployees=50,
    BillingCity='San Francisco');
insert acct;
// Once the account is inserted, the sObject will be
// populated with an ID.
// Get this ID.
ID acctID = acct.ID;
// Add a contact to this account.
Contact con = new Contact(
    FirstName='Carol',
    LastName='Ruiz',
    Phone='(415)555-1212',
    Department='Wingo',
    AccountId=acctID);
insert con;
// Add account with no contact
Account acct2 = new Account(
    Name='The SFDC Query Man',
    Phone='(310)555-1213',
    NumberOfEmployees=50,
    BillingCity='Los Angeles',
    Description='Expert in wing technologies.');
insert acct2;

使用查询编辑器

Developer Console 提供查询编辑器控制台,使您能够运行 SOSL 查询并查看结果。查询编辑器提供了一种快速检查数据库的方法。将 SOSL 查询添加到 Apex 代码前,建议先测试 SOSL 查询。当您使用查询编辑器时,您只需提供 SOSL 语句,而不包含围绕它的 Apex 代码。

让我们试着运行以下 SOSL 示例:

  1. 在 Developer Console 中,单击 Query Editor(查询编辑器)选项卡。
  2. 将以下内容复制并粘贴到查询编辑器下的第一个框中,然后单击 Execute(执行)
FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)

组织中满足条件的所有客户和联系人记录都在 Query Results(查询结果)部分显示为包含字段的行。结果按每个对象(客户或联系人)的选项卡进行分组。SOSL 查询返回值与 Wingo 匹配的字段的记录。根据我们的示例数据,只有一个联系人具有 Wingo 值的字段,因此返回此联系人。

备注

查询编辑器和 API 中的搜索查询必须用大括号括起来 ({Wingo})。相反,在 Apex 中,搜索查询包含在单引号内 ('Wingo')。

SOSL 基础语法

SOSL 允许您指定以下搜索条件:

  • 要搜索的文本表达式(单个单词或短语)
  • 要搜索的字段范围
  • 要检索的对象和字段列表
  • 在源对象中选择行的条件

以下是 Apex 中的 SOSL 基础查询语法: 

FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]

请记住,在查询编辑器和 API 中,语法略有不同:

FIND {SearchQuery} [IN SearchGroup] [RETURNING ObjectsAndFields]

SearchQuery 表示要搜索的文本(单个单词或短语)。搜索词可以与逻辑运算符(AND、OR)和括号组合。此外,搜索词可以包含通配符(*、?)。通配符 * 在搜索词的中间或结尾匹配零个或多个字符。通配符 ? 只匹配搜索词中间或结尾的一个字符。

文本搜索不区分大小写。例如,搜索 CustomercustomerCUSTOMER 都会返回相同的结果。

SearchGroup 是可选的。它表示要搜索的字段范围。如果未指定,则默认搜索范围是所有字段。SearchGroup 可以取以下值之一。

  • ALL FIELDS
  • NAME FIELDS
  • EMAIL FIELDS
  • PHONE FIELDS
  • SIDEBAR FIELDS

ObjectsAndFields 是可选的。它表示在搜索结果中返回的信息 — 单个或多个 sObject 列表,并且在每个 sObject 中,包含一个或多个字段的列表、并带有可筛选的值。如果未指定,则搜索结果包含找到的所有对象的 ID。

单个单词或短语

SearchQuery 包含两种类型的文本:

  • 单词 — 单个单词,例如 testhelloSearchQuery 中的单词以空格、标点符号和从字母到数字(或者数字到字母的)的变化来分隔。单词总是不区分大小写。
  • 短语 — 由双引号包围的单词和空格的集合,例如 "john smith"。多个单词可以与逻辑和分组运算符组合在一起,形成一个更复杂的查询。

搜索示例

要了解 SOSL 搜索的工作原理,让我们使用不同的搜索字符串,看看基于示例数据会输出什么结果。下表列出了各种示例搜索字符串和 SOSL 搜索结果。

在所有字段中搜索:

搜索描述

匹配记录和字段

The Query

此搜索返回文本任意位置中字段包含两个单词 The 和 Query 的所有记录。搜索词的单词顺序可任意排列。

客户:The SFDC Query Man(匹配名称字段)

Wingo OR Man

此搜索使用 OR 逻辑运算符。返回字段包含单词 Wingo 或 Man 的记录。

联系人:Carol Ruiz,部门:'Wingo'

客户:The SFDC Query Man(匹配名称字段)

1212

此搜索返回字段包含 1212 字样的所有记录。匹配以 -1212 结尾的电话字段,因为 1212 在以破折号分隔时被视为一个词。

客户:SFDC Computing,电话:'(415)555-1212’

联系人:Carol Ruiz,电话:'(415)555-1212'

wing*

这是通配符搜索。此搜索返回具有以 wing 开头的字段值的所有记录。

联系人:Maria Ruiz,部门:'Wingo'

客户:The SFDC Query Man,描述:'Expert in wing technologies.’

SOSL Apex 示例

此示例展示如何在 Apex 中运行 SOSL 查询。首先,为变量 soslFindClause 分配搜索查询,该查询由通过 OR 逻辑运算符结合的两个词(Wingo 和 SFDC)组成。SOSL 查询通过在变量前加上冒号来引用此本地变量,也称为绑定所生成的 SOSL 查询将搜索所有字段中的 Wingo 或 SFDC。本示例返回所有示例客户,因为每个客户都有包含其中一个词的字段。SOSL 搜索结果以列表的形式返回。每个列表包含返回记录的数组。这种情况下,列表有两个元素。在索引 0 处,列表包含客户数组。在索引 1 处,列表包含联系人数组。

在 Developer Console 的 Execute Anonymous(执行匿名) 窗口中执行此代码片段。接下来,检查调试日志以验证是否返回所有记录。

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);
}

了解详细信息...

您可以筛选、重新排序和限制 SOSL 查询的返回结果。因为 SOSL 查询可以返回多个 sObject,所以这些筛选器应用在 RETURNING 子句中的每个 sObject 中。

您可以通过在对象的 WHERE 子句中添加条件来筛选 SOSL 结果。例如,这将仅返回服装行业的客户:RETURNING Account(Name, Industry WHERE Industry='Apparel')

同样,支持通过为对象添加 ORDER BY 实现对 sObject 的结果进行排序。例如,这会导致返回的客户按名称字段排序:RETURNING Account(Name, Industry ORDER BY Name)

返回记录的数量可以限制为记录的一个子集。此示例限制仅返回 10 个客户: RETURNING Account(Name, Industry LIMIT 10)

资源

在 Salesforce 帮助中分享 Trailhead 反馈

我们很想听听您使用 Trailhead 的经验——您现在可以随时从 Salesforce 帮助网站访问新的反馈表单。

了解更多 继续分享反馈