定义同义词

在引用某种概念或事物时,组织通常会采用独特的术语或多种引用方式。建议您定义同义词以建立等效术语,从而帮助用户在搜索时找到相关项。

如需定义同义词,请使用 _dictionaryEntry 众所周知将项编入索引 架构。

_dictionaryEntry 类型的项可以具有以下属性:

属性 类型 说明 是否必需?
_term string 需要定义的术语。推荐值是不带连字符的字词或不带标点符号的短语。 必填
_synonym string (repeated) 需要包含在与 _term 中定义的字符串匹配的查询中的替代术语。 必填
_onlyApplicableForAttachedSearchApplications boolean 可让您按数据源和搜索应用对同义词进行分组。如需了解详情,请参阅定义特定于数据源的同义词 可选

如果用户在查询中包含 _term 属性的值, 则有效查询将变为“字词 OR 同义词”。例如,如果 字词“"scifi"”使用同义词定义 按 "science fiction",然后查询 包含字词“"scifi"”与包含以下内容的项匹配: 任意"scifi""science fiction."

同义词只能单向应用。如果查询是针对 "science fiction," Cloud Search 不向查询应用任何同义词。该查询仅匹配包含 "science fiction." 件商品包含 省略了 "scifi"

如需让这两个术语可以互换,请分别定义每个术语:

术语 同义词
scifi science fiction
science fiction scifi

在查询处理过程中, 到应用同义词。用户查询 "sci-fi"_term "sci fi." 匹配 要为用户可能会用连字符连接的术语创建同义词,请先进行标准化 _term 以使用空格代替连字符。

继续上面的示例,以下定义与用户查询处理 "sci-fi," "sci fi," "scifi,"和 可互换的 "science fiction"

术语 同义词
scifi science fiction, sci fi
sci fi science fiction, scifi
science fiction scifi, sci fi

默认情况下,任何数据源中的同义词都适用于整个网域。 具体而言,所有搜索应用均可使用同义词 而不考虑数据源如果您需要特定于数据源的同义词,请参阅 定义特定于数据源的同义词

使用 Cloud Search SDK 定义全局同义词

您可以使用 Content Connector SDK 定义术语及其同义词。有关构建连接器的说明,请参阅创建内容连接器

以下代码段展示了如何构建 RepositoryDoc 根据 CSV 文件记录表示术语和同义词:

DictionaryConnector.java
/**
 * Creates a document for indexing.
 *
 * For this connector sample, the created document is domain public
 *  searchable. The content is a simple text string.
 *
 * @param record The current CSV record to convert
 * @return the fully formed document ready for indexing
 */
private ApiOperation buildDocument(CSVRecord record) {
  // Extract term and synonyms from record
  String term = record.get(0);
  List<String> synonyms = StreamSupport.stream(record.spliterator(), false)
      .skip(1) // Skip term
      .collect(Collectors.toList());

  Multimap<String, Object> structuredData = ArrayListMultimap.create();
  structuredData.put("_term", term);
  structuredData.putAll("_synonym", synonyms);

  if (Configuration.getBoolean("dictionary.attachedToSearchApp", false).get()) {
    structuredData.put("_onlyApplicableForAttachedSearchApplications", true);
  }

  String itemName = String.format("dictionary/%s", term);

  // Using the SDK item builder class to create the item
  Item item =
      IndexingItemBuilder.fromConfiguration(itemName)
          .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
          .setObjectType("_dictionaryEntry")
          .setValues(structuredData)
          .setAcl(DOMAIN_PUBLIC_ACL)
          .build();

  // Create the fully formed document
  return new RepositoryDoc.Builder()
      .setItem(item)
      .build();
}

定义同义词时,请注意以下事项:

  • 同义词条目必须在网域范围内公开。在上述示例中,这是通过将 ACL 设置为 DOMAIN_PUBLIC_ACL 来实现的。
  • 不应为您的配置文件定义以下属性 因为它们会覆盖您代码中的域公开设置:
    • defaultAcl.mode=FALLBACK
    • defaultAcl.public=true

定义搜索应用专用同义词

默认情况下,同义词会应用于所有搜索中的所有数据源 应用。

不过,假设贵组织有单独的工程团队和销售团队, 您希望为每个团队提供不同的搜索体验,包括 特定于工作角色的同义词。在这种情况下,您可以创建一个搜索 具有特定工程的数据源、同义词和其他 包含销售特定数据源和同义词的搜索应用程序。要实现 可将特定数据源中的每个同义词编入索引 使用 _onlyApplicableForAttachedSearchApplications=true。这个 设置可对同义词进行限制,使其仅应用于搜索 包含特定数据源的应用。

例如,将 下面的代码行添加到上一个代码示例可确保编入索引的同义词 因数据源而异:

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);