Google Cloud Search 架构采用 JSON 结构,其中定义了将数据编入索引及查询数据时要使用的对象、属性和选项。内容连接器会使用注册的架构来设计存储区数据结构并将数据编入索引。
您可以通过向 API 提供一个 JSON 架构对象来创建架构。在为数据编制索引之前,您必须先为每个存储区注册一个架构。
本文档介绍了架构创建方面的基础知识。如需优化搜索体验,请参阅提高搜索质量。
创建架构
请按照以下步骤创建 Cloud Search 架构:
确定预期用户行为
预测用户搜索方式有助于确定架构策略。对于电影数据库,用户可能会搜索“罗伯特·雷德福主演的电影”。您的架构必须支持查询由特定演员主演的电影。
为了使架构与用户行为保持一致,请执行以下操作:
- 评估不同用户的各种查询。
- 确定逻辑数据集或对象,例如“电影”。
- 确定商品名或发布日期等属性。
- 确定属性的有效值,例如“夺宝奇兵”。
- 确定排序和排名需求,例如按时间顺序或观众评分排序。
- 识别职位等上下文属性,以改进自动补全建议。
- 列出这些对象、属性和示例值。使用此列表定义运算符选项。
初始化数据源
数据源表示存储在 Google Cloud 中的已编入索引的存储区数据。请参阅管理第三方数据源。 当用户点击某个结果时,Cloud Search 会使用索引请求中的网址将用户定向到相应内容。
定义对象
对象是架构的基本单元。“电影”或“人物”等逻辑结构是对象。每个对象都有属性,例如标题、时长或名称。
架构是 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"
}
}
}
]
}]
}
PropertyDefinition 包含以下内容:
- 一个
name字符串。 - 不限定类型的选项(例如,
isReturnable)。 - 类型和类型特有选项(例如
textPropertyOptions)。 operatorOptions表示搜索运算符。displayOptions(用于界面标签)。
您可以在不同的对象中重复使用属性名称。例如,movieTitle 可以同时出现在 movie 对象和 person 对象的影视作品目录中。
添加不限定类型的选项
PropertyDefinition 包含用于配置属性搜索功能的布尔值选项,无论属性类型为何。这些选项的默认值为 false,必须设置为 true 才能使用。
isReturnable:如果应使用 Query API 在搜索结果中返回相应属性数据,则设置为true。不可返回值的属性可用于搜索或排名,但不会显示在结果中。isRepeatable:如果相应属性可以有多个值,则设置为true。例如,一部电影只有一个发布日期,但有多名演员。isSortable:如果该属性可用于排序,请将其设置为true。如果isRepeatable为true,或者相应属性位于可重复的子对象内,则不能为true。isFacetable:如果相应属性可用于生成分面(用于优化搜索结果的属性),则设置为true。- 要求
isReturnable为true。 - 仅支持枚举、布尔和文本类型的属性。
- 要求
isWildcardSearchable:设置为true可允许用户对此属性执行通配符搜索。此选项仅适用于文本属性,其行为取决于exactMatchWithOperator设置:- 如果
exactMatchWithOperator为true:文本值会被视为单个令牌。类似science-*的查询与值science-fiction匹配。 - 如果
exactMatchWithOperator为false:文本值会被分词。sci*或fi*等查询与science-fiction匹配,但science-*不匹配。
- 如果
定义类型
通过定义适当的属性选项对象(例如,textPropertyOptions)。如果您知道所有可能的值,请使用枚举 (enumPropertyOptions)。一个属性只能有一种数据类型。
定义运算符选项
operatorOptions 描述属性如何用作搜索运算符。
每个 operatorOptions 都需要一个 operatorName(例如,title)。这是用户在查询中输入的参数(例如,title:titanic)。使用直观的名称并向用户公开。
您可以在同一类型的资源之间共享 operatorName。使用该名称的查询会从所有匹配的媒体资源中检索结果。
可排序的属性可以包括 lessThanOperatorName 和 greaterThanOperatorName(用于比较查询)。文本属性可以使用 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)来限制结果。
调整架构
监控用户反馈并调整架构。您可能会为新字段编制索引,或者重命名运算符以使其更直观。
架构更改后重新编制索引
您无需重新编制索引即可应用以下更改:
- 运算符名称。
- 数值限制。
- 有序排名。
- 新鲜度或显示选项。
您必须重新编制以下内容的索引:
- 添加或移除属性或对象。
- 将
isReturnable、isFacetable或isSortable更改为true。 - 将房源标记为
isSuggestable。
不允许的属性更改
不允许进行会破坏索引或导致结果不一致的更改,包括:
- 属性数据类型或名称。
exactMatchWithOperator或retrievalImportance设置。
对架构进行复杂更改
如需进行不允许的更改,请将属性从旧定义迁移到新定义:
- 向架构添加一个名称不同的新属性。
- 注册包含新属性和旧属性的架构。
- 仅使用新属性回填索引。
- 从架构中删除旧属性。
- 更新查询代码以使用新的属性名称。
Cloud Search 会将已删除的项记录保留 30 天,以防止出现重复使用问题。
大小限制
- 最多 10 个顶级对象。
- 最大深度为 10 级。
- 每个对象最多包含 1000 个字段(包括嵌套字段)。
后续步骤
- 创建搜索界面。
- 提高搜索质量。
- 构建架构以获得最佳查询解释。
- 定义同义词。