创建并注册架构

Google Cloud Search 架构采用 JSON 结构,其中定义了将数据编入索引及查询数据时要使用的对象、属性和选项。您的内容连接器会使用注册的架构来设计存储区数据结构以及将数据编入索引。

您可以通过向 API 提供一个 JSON 架构对象来创建架构。您必须先为每个存储区注册架构,然后才能将数据编入索引。

本文档介绍了创建架构方面的基础知识。如需优化搜索体验, 请参阅提高搜索质量

创建架构

如需创建 Cloud Search 架构,请按以下步骤操作:

  1. 确定预期用户行为
  2. 初始化数据源
  3. 定义对象
  4. 定义对象属性
  5. 注册架构
  6. 将数据编入索引
  7. 测试架构
  8. 调整架构

确定预期用户行为

预测用户搜索方式有助于定义架构策略。对于电影数据库,用户可能会搜索“由罗伯特·雷德福主演的电影”。 您的架构必须支持查询由特定演员主演的电影。

如需使架构与用户行为保持一致,请执行以下操作:

  1. 评估不同用户的各种查询。
  2. 确定逻辑数据集或 对象,例如“电影”。
  3. 确定 属性(特性),例如标题或发布日期。
  4. 确定属性的有效 值,例如“夺宝奇兵”。
  5. 确定排序和排名需求,例如按时间顺序或观众评分。
  6. 确定上下文属性(例如职位),以改进自动补全建议。
  7. 列出这些对象、属性和示例值。使用此列表来 定义运算符选项

初始化数据源

数据源表示存储在 Google Cloud 中的已编入索引的存储区数据。请参阅 管理第三方数据源。 当用户点击某个结果时,Cloud Search 会使用索引请求中的网址将用户定向到相应项。

定义对象

对象是架构的基本单元。“电影”或“人物”等逻辑结构是对象。每个对象都有 属性,例如标题、时长或姓名。

实体间的架构连接图
图 1.此示例架构显示了两个对象和一个 子对象。

一个 架构 是 对象定义在 objectDefinitions 标记中的列表。

{
  "objectDefinitions": [
    { "name": "movie" },
    { "name": "person" }
  ]
}

为每个对象使用唯一的名称,例如 movie。架构服务会将这些名称用作键。请参阅 ObjectDefinition

定义对象属性

propertyDefinitions 部分中定义属性,例如标题和发布日期。将 options 用于 freshnessOptions (排名)和 displayOptions (界面标签)。

{
  "objectDefinitions": [{
    "name": "movie",
    "propertyDefinitions": [
      {
        "name": "movieTitle",
        "isReturnable": true,
        "textPropertyOptions": {
          "retrievalImportance": { "importance": "HIGHEST" },
          "operatorOptions": { "operatorName": "title" }
        },
        "displayOptions": { "displayLabel": "Title" }
      },
      {
        "name": "releaseDate",
        "isReturnable": true,
        "isSortable": true,
        "datePropertyOptions": {
          "operatorOptions": {
            "operatorName": "released",
            "lessThanOperatorName": "releasedbefore",
            "greaterThanOperatorName": "releasedafter"
          }
        }
      }
    ]
  }]
}

A PropertyDefinition 包括:

  • name 字符串。
  • 不限定类型的选项(例如 isReturnable)。
  • 类型和特定于类型的选项(例如 textPropertyOptions)。
  • 用于搜索运算符的 operatorOptions
  • 用于界面标签的 displayOptions

您可以在不同的对象中重复使用属性名称。例如,movieTitle 可以同时出现在 movie 对象和 person 对象的电影作品列表中。

添加不限定类型的选项

PropertyDefinition 包含布尔值选项,用于为属性配置搜索功能, 无论其类型如何。这些选项默认设置为 false,必须设置为 true 才能使用。

  • isReturnable:如果应使用 Query API 在搜索结果中返回属性数据,请设置为 true。不可返回值的属性可用于搜索或排名,但不会显示在结果中。
  • isRepeatable:如果属性可以有多个值,请设置为 true。例如,一部电影有一个发布日期,但有多位演员。
  • isSortable:如果属性可用于排序,请设置为 true。如果 isRepeatabletrue,或者属性位于可重复的子对象内,则不能为 true
  • isFacetable:如果属性可用于生成 Facet(用于优化搜索结果的属性),请设置为 true
    • 需要将 isReturnable 设置为 true
    • 仅支持枚举、布尔和文本类型的属性。
  • isWildcardSearchable:设置为 true,以允许用户对此属性执行通配符搜索。此选项仅适用于文本类型的属性,其行为取决于 exactMatchWithOperator 设置:
    • 如果 exactMatchWithOperatortrue:文本值将被视为单个令牌。类似 science-* 的查询与值 science-fiction 匹配。
    • 如果 exactMatchWithOperatorfalse:文本值将被标记化。类似 sci*fi* 的查询与 science-fiction 匹配,但 science-* 不匹配。

定义类型

通过定义适当的属性选项对象(例如 textPropertyOptions)来设置数据类型。如果您知道所有可能的值,请使用枚举 (enumPropertyOptions)。一个属性只能有一种数据类型。

定义运算符选项

operatorOptions 描述了属性如何充当搜索运算符。

每个 operatorOptions 都需要一个 operatorName(例如 title)。这是用户在查询中输入的参数(例如 title:titanic)。请使用直观的名称并向用户公开这些名称。

您可以跨相同类型的属性共享 operatorName。使用该名称的查询会从所有匹配的属性中检索结果。

可排序的属性可以包含 lessThanOperatorNamegreaterThanOperatorName,用于比较查询。文本类型的属性可以使用 exactMatchWithOperator 将整个值视为单个令牌。

添加显示选项

可选的 displayOptions 部分包含 displayLabel。这是在搜索结果中显示的用户友好型标签。

添加建议过滤运算符

使用 suggestionFilteringOperators[] 定义用于过滤自动补全建议的属性(例如,按用户的首选类型过滤电影建议)。您只能定义一个建议过滤器。

注册架构

使用数据源 ID 向架构服务注册架构。发出 一个 UpdateSchema 请求:

PUT https://cloudsearch.googleapis.com/v1/indexing/{name=datasources/*}/schema

使用 validateOnly: true 测试架构,而无需注册。

将数据编入索引

注册后,使用 索引 调用(通常使用连接器)填充数据源。

索引请求示例:

{
  "name": "datasource/<data_source_id>/items/titanic",
  "metadata": {
    "title": "Titanic",
    "objectType": "movie"
  },
  "structuredData": {
    "object": {
      "properties": [{
        "name": "movieTitle",
        "textValues": { "values": ["Titanic"] }
      }]
    }
  },
  "itemType": "CONTENT_ITEM"
}

测试架构

在投入生产之前,先使用小型存储区进行测试。创建一个 ACL,将结果限制为测试用户。

  • 宽泛查询:搜索字符串(例如“titanic”),以查看所有 匹配的项。
  • 运算符查询:使用运算符(例如 actor:Zane)来限制结果。

调整架构

监控用户反馈并调整架构。您可以将新字段编入索引,或重命名运算符以使其更直观。

架构更改后重新编制索引

对于以下更改,您无需重新编制索引:

  • 运算符名称。
  • 数值限制。
  • 有序排名。
  • 新鲜度或显示选项。

您必须为以下更改重新编制索引:

  • 添加或移除属性或对象。
  • isReturnableisFacetableisSortable 更改为 true
  • 将属性标记为 isSuggestable

不允许的属性更改

不允许进行会破坏索引或导致结果不一致的更改,包括:

  • 属性数据类型或名称。
  • exactMatchWithOperatorretrievalImportance 设置。

对架构进行复杂更改

如需进行不允许的更改,请将属性从旧定义迁移到新定义:

  1. 向架构添加一个名称不同的新属性。
  2. 使用新属性和旧属性注册架构。
  3. 仅使用新属性回填索引。
  4. 从架构中删除旧属性。
  5. 更新查询代码以使用新属性名称。

Cloud Search 会记录已删除的项 30 天,以防止重复使用问题。

大小限制

  • 顶层对象的数量不得超过 10 个。
  • 深度不得超过 10 层。
  • 每个对象(包括嵌套字段)的字段数不得超过 1000 个。

后续步骤

  1. 创建搜索界面
  2. 提高搜索质量
  3. 构建架构以获得最佳查询解释
  4. 定义同义词