概览

Google 合作伙伴可以通过预订等候名单集成功能向 Google 提供结构化菜单数据,以便在餐馆的 Google 商家资料的菜单部分以及 Google 消费者平台上的其他入口点中使用这些数据。

菜单数据使用通用 Feed 进行提取。开始前须知:

  1. 请确保您已完成账号设置
  2. 了解通用 Feed 上传流程
  3. 了解如何配置账号以进行通用 Feed 上传

创建和上传菜单 Feed

创建和上传菜单 Feed 时,请遵循以下准则和惯例:
  • 如需提供餐厅详细信息,请遵循商家 Feed 中描述的数据规范。 如需查看 JSON 文件示例,请参阅示例 JSON。 每次上传的数据文件名应保持唯一。建议在文件名中添加时间戳,例如 menu1_1633621547.json
  • 在菜单 Feed 的文件集描述符中,将 name 字段设置为 google.food_menu。 如需查看描述符文件内容示例,请参阅描述符文件 JSON 示例。 描述符文件的名称在不同上传之间应保持唯一。建议在文件名中添加时间戳,例如 descriptor_1633621547.filesetdesc.json。 描述符文件必须作为菜单 Feed 的一部分上传到通用 SFTP 服务器。
  • 必须每天以完全刷新的方式将 Feed 上传到通用的 SFTP 服务器。
  • 将 Feed 限制为最多 1000 个分片(文件),如使用通用 Feed sftp 中所述

您可以在合作伙伴门户网站的提取 > 历史记录部分中查看 Feed 提取状态。您可以在合作伙伴门户的配置 > Feed 部分找到 Feed SFTP 服务器信息。

选择 Feed SFTP 服务器

图 1: 常规 SFTP 服务器信息

您可以在合作伙伴门户网站的提取 > 历史记录部分中查看 Feed 提取状态。您可在合作伙伴门户的配置 > Feed 部分中找到 Feed SFTP 服务器信息。

使用菜单项选项

可以使用 MenuItemOption proto 指定菜单项选项。

如果合作伙伴的单个菜单项有多个必需的选项集(例如,拿铁有尺寸选项和牛奶选项),则必须决定如何在 Google 中以最佳方式显示这些选项。Google 建议您采取以下措施:

  • 菜单 Feed 应与合作伙伴的点餐网站(或餐厅的堂食菜单,如果您没有该营业地点的点餐网站)保持一致。如果商品在订购网站上显示了单价,则应使用 MenuItem。如果商品显示有基本价格和多个选项,则应使用 MenuItemOption
  • 避免包含过长的选项列表,例如:
    • 鸡肉卷饼
    • 含奶酪的鸡肉卷饼
    • 鸡肉卷饼配萨尔萨酱
    • 鸡肉卷饼,搭配萨尔萨酱和奶酪
    • 鸡肉卷饼配鳄梨酱
    • 鸡肉卷饼,搭配鳄梨酱和萨尔萨酱
  • 仅当菜品需要选择某个选项时,才支持菜单项选项。例如,在订购披萨时,尺寸是必选选项。不支持用于加购项(例如“添加鳄梨的选项”)的菜单项选项,并且不应将其纳入 Feed 中。

菜单项选项价格应为选择相应选项后商品的完整价格。应为菜单项或其选项设置价格,但不能同时为两者设置价格。

提供多种菜单的餐厅

一家餐厅(实体)只能有一个菜单。对于有多个菜单(即单独的午餐和晚餐菜单)的餐厅,您可以将所有菜单合并为一个菜单,并使用 MenuSections(即一个菜单包含午餐部分和晚餐部分)。生成的菜单将具有以下结构:

  • 菜单
    • “午餐”部分
        • 汤 1
        • 汤 2
      • 三明治
        • 三明治 1
        • 三明治 2
    • “晚餐”部分
      • 首发阵容
        • Starter 1
        • Starter 2
      • 主赛
        • 主菜 1
        • 主菜 2

跨餐厅共享菜单

通过在菜单的 merchant_ids 列表中包含所有餐厅,可以在多个餐厅之间共享单个菜单。请注意,此列表接受使用 Entity Feed 的合作伙伴的实体 ID。

最佳做法

以下是开发菜单 Feed 时应遵循的最佳实践。

  • 只能将一个菜单与一家餐厅相关联。
  • TextField 中,将首选语言作为第一种语言提供。如果您发送多个 LocalizedText 对象,系统会向用户显示文本列表中的第一个对象。
  • 所有菜单项都必须添加到菜单版块中。 请勿直接向菜单对象添加菜单项。
  • 使用 UTF-8 编码提供内容。无需转义非 ASCII 字符。
  • 如果您要在多个地区发布,请确保在单位和 nanos 字段中使用正确的币种代码和面额 - 请特别注意 nanos 字段,该字段是单位的 10^-9。使用商品目录查看器中的菜单可视化工具确认您已正确设置价格。
  • 为用户提供视觉效果丰富、内容全面且新鲜的菜单,是打造实用且引人入胜的用户体验的关键。价格、说明、照片和饮食信息都是促成决策的关键要素,我们鼓励合作伙伴尽可能多地提供这些数据,以提供最佳的用户和商家体验。
  • 如需不显示价格,请在 Offer proto 中添加空的 Price proto。

菜单 Feed 发布后,您的菜单 Feed 数据将可以在发现体验中显示,并且可能会显示在餐厅地点信息页的“菜单”标签页中。Google 搜索(移动版和桌面版)支持“菜单”标签页,并且该功能将扩展到更多平台,包括 Google 地图。呈现的体验可能会因界面而异。

显示带有说明的菜单项的菜单示例

图 3: 菜单 Feed 内容在移动版商家资料中的显示示例

为确保菜单结构正确,请使用商品目录查看器中的菜单可视化工具预览菜单。

餐厅菜单可能来自多种来源,包括餐厅本身通过其 Google 商家资料、食品订购和预订合作伙伴、用户拍摄的菜单照片等。如果多个来源为同一餐厅提供菜单,商家可以在 Google 商家资料菜单编辑器中选择首选提供商

架构

如需查看完整的菜单架构,请点击此处

FoodMenuFeed

字段名称类型要求说明
data对象数组
(MenuComponent)

字段名称类型要求说明
oneOf
(type)

只能设置相应 oneOf 中的一个字段。

食品机构提供的食品的顶层目录。菜单包含商家 ID 列表以及适用于这些商家的菜单。 菜单可用于表示提供菜单的单个商家,也可用于表示提供菜单的多个商家(通常是连锁餐厅)。

字段名称类型要求说明
menu_id字符串

必需

合作伙伴提供的不透明字符串,用于唯一标识合作伙伴 Feed 中的菜单。 必填。
merchant_ids字符串数组

必需

菜单所适用的商家。 注意:此字段会重复出现,以便连锁餐厅可以在多个位置(每个位置都是单独的商家)共享同一份菜单。必填。
display_name对象
(TextField)

用户浏览菜单时可用于标识菜单的名称。 可选。
language字符串

与菜单中包含的文本标签关联的默认语言代码。需要 BCP-47 语言代码,例如“en-US”或“sr-Latn”。 如需了解详情,请参阅 http://www.unicode.org/reports/tr35/#Unicode_locale_identifier。 可选。

TextField

包含一个或多个本地化值的文本载荷。

字段名称类型要求说明
text对象数组
(LocalizedText)

必需

每个语言区域的文本值。 如果只需要支持一种语言区域,则无需在每个文本中设置 language_code,系统会根据菜单的默认语言推断出语言。 如果不同语言区域设置了多个文本,则必须为每个文本设置 language_code。列表中的第一个文本被视为首选表示形式。 必填。

LocalizedText

特定语言的本地化文本变体。

字段名称类型要求说明
text字符串

与下方的 [language_code][google.type.LocalizedText.language_code] 对应的语言的本地化字符串。
language_code字符串

文本的 BCP-47 语言代码,例如“en-US”或“sr-Latn”。 如需了解详情,请参阅 http://www.unicode.org/reports/tr35/#Unicode_locale_identifier。

菜单版块是指菜单上的一组商品。通常会为菜单上每个逻辑分组的项创建单独的 MenuSection。例如,餐点类型(开胃菜、主菜、甜点)和食品类别(汉堡、饮料)是典型的版块。

字段名称类型要求说明
menu_section_id字符串

必需

合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuSection。 必填。
display_name对象
(TextField)

必需

用户浏览菜单时可用于标识 MenuSection 的名称。 必填。
description对象
(TextField)

菜单部分的说明。 可选。
images对象数组
(Image)

菜单部分的图片。 可选。

图片

表示与菜单实体相关联的图片。

字段名称类型要求说明
uri字符串

必需

包含图片原始像素的网址。 必填。

表示食品机构提供的单个食品或饮料。

字段名称类型要求说明
menu_item_id字符串

必需

合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuItem。 必填。
display_name对象
(TextField)

必需

用户浏览菜单时可用于标识 MenuItem 的名称。 必填。
description对象
(TextField)

菜单项的说明。 可选。
images对象数组
(Image)

菜单项的图片。 可选。
oneOf
(pricing)

必需

只能设置相应 oneOf 中的一个字段。
item_attributes对象
(MenuItemAttributes)

有关相应菜单项的属性。 可选。

OfferSet

用于存储菜单项 / 选项上可用的优惠列表的容器。 在特定时间,只能有一个优惠适用/有效。 例如,某款饮品可以有 2 项优惠,其中一项适用于上午,另一项适用于傍晚的欢乐时光。

字段名称类型要求说明
offers对象数组
(Offer)

必需

可能优惠的列表。 必填。

优惠

表示 MenuItem 和 MenuItemOption 的价格和提供情况信息。

字段名称类型要求说明
price对象
(Money)

以下情况无效,会导致菜单项被舍弃: 价格没有币种代码,但有单位或纳诺或两者都有: price {units: 100, nanos: 1000000} price {units: 100} price {nanos: 1000000} 价格的币种代码无效,但有单位或纳诺或两者都有: price {currency_code: 'gXYZ', units: 100, nanos: 1000000} price {currency_code: 'gXYZ', units: 100} price {currency_code: 'gXYZ', nanos: 1000000} 价格有币种代码,但单位或纳诺无效 price {currency_code: 'USD', units: 100, nanos: -100} price {currency_code: 'USD', units: -100, nanos: 100}

Money

表示含有货币类型的金额。

字段名称类型要求说明
currency_code字符串

采用 ISO 4217 标准定义的三位字母货币代码。
units字符串

金额的整数单位。 例如,如果 currencyCode"USD",则 1 单位就是一美元。
nanos数值

以纳单位 (10^-9) 表示的金额数量。 取值范围必须在 -999,999,999 至 +999,999,999 之间(含边界值)。 如果 units 是正数,nanos 必须是正数或零。 如果 units 是零,nanos 可以是正数、零或负数。 如果 units 是负数,nanos 必须是负数或零。 例如,$-1.75 表示为 units=-1 和 nanos=-750,000,000。

用于指定商品上可用的选项列表的容器。

字段名称类型要求说明
menu_item_option_ids字符串数组

必需

适用于相应菜单项的菜单项选项的 ID。 必填。

描述特定菜单项或选项的相关属性。

字段名称类型要求说明
number_of_servings数值

指定菜单项中可提供的份数。 可选。
nutrition_information对象
(NutritionInformation)

描述商品的所有营养信息,例如卡路里、脂肪含量。可选。
suitable_diets枚举
(DietaryRestriction)的数组

相应菜单项所符合的饮食禁忌。 可选。
additive对象数组
(Additive)

相应菜单项的添加剂。 可选。
allergen对象数组
(Allergen)

相应菜单项的过敏原。 可选。
packaging_deposit_info对象
(DepositInfo)

相应菜单项的包装和回收信息。可选。

NutritionInformation

描述 MenuItem 或附加项的所有营养成分测量值。

字段名称类型要求说明
energy对象
(NutritionValue)

一份食物的营养能量。可以按卡路里或千焦耳定义。 可选。
sodium_content对象
(NutritionValue)

钠含量,以克或毫克为单位。 可选。
serving_size数值

营养价值所适用的份数。 可选。
description对象
(TextField)

自由文本格式的营养信息。例如“含有防腐剂”。 可选。

NutritionValue

描述一份食物的单项营养测量结果。

字段名称类型要求说明
oneOf
(value)

只能设置相应 oneOf 中的一个字段。
unit枚举
(NutritionValueUnit)

必需

与金额关联的单位,由合作伙伴指定。我们将验证 Feed,确保每种营养价值的单位与该营养价值的类型相符。例如,在 NutritionalInformation 的能量属性中,仅应包含 ENERGY_CALORIES 和 ENERGY_KILOJOULES。必填。

Range

描述营养值的闭合范围。例如“100-150 卡路里”

字段名称类型要求说明
min数值

必需

最低营养价值。 必填。
max数值

必需

营养价值的最大值。 必填。

加法

在 MenuItem 上向用户显示的加料。添加剂可保持或提升食品的品质。

字段名称类型要求说明
name对象
(TextField)

必需

添加剂的描述性文字,例如“防腐剂”。 必填。
containment_level_code枚举
(ContainmentLevelCode)

相应 MenuItem 是否包含、可能包含或不包含相应添加剂。 默认值为 contains。 可选。

过敏原

在 MenuItem 上向用户显示的过敏原。过敏原是指会导致过敏反应的食物成分。

字段名称类型要求说明
allergen_type_code枚举
(AllergenTypeCode)

必需

过敏原类型。 必填。
containment_level_code枚举
(ContainmentLevelCode)

相应 MenuItem 是否包含、可能包含或不包含相应过敏原。 默认值为 contains。 可选。

DepositInfo

合作伙伴提供的押金信息,用于指导用户如何存放食品或瓶子以及此类押金的价值。

字段名称类型要求说明
deposit_code枚举
(DepositCode)

要采用的押金策略,例如“可重复使用”。 可选。
deposit_value对象
(Money)

因正确存放商品而退还的金额。可选。

描述用户在选择菜肴 / 套餐时需要做出的选择。用户必须选择一个选项,否则订单将被视为无效(例如,用户必须为披萨选择小号、中号或大号)。

字段名称类型要求说明
menu_item_option_id字符串

必需

合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuItemOption。 必填。
value对象
(MenuItemOptionProperty)

必需

选项属性和值,例如“尺寸:小”。 必填。

描述菜单项选项的属性及其值。

字段名称类型要求说明
property_type枚举
(PropertyType)

必需

相应选项属性的类型。 必填。
oneOf
(value)

必需

只能设置相应 oneOf 中的一个字段。

NutritionValueUnit

名称说明
NUTRITION_VALUE_UNIT_UNSPECIFIED请勿使用。未明确设置营养价值单位。
ENERGY_CALORIES用于表示菜单项中能量含量的单位。
ENERGY_KILOJOULES
WEIGHT_MILLIGRAMS用于表示菜单项中某种物质的重量的单位。
WEIGHT_GRAMS

DietaryRestriction

表示在食物准备过程中遵守的饮食限制或指南。

名称说明
DIET_UNSPECIFIED请勿使用。未明确指定饮食禁忌。
DIET_DIABETIC
DIET_GLUTEN_FREE
DIET_HALAL
DIET_HINDU
DIET_KOSHER
DIET_LOW_CALORIE
DIET_LOW_FAT
DIET_LOW_LACTOSE
DIET_LOW_SALT
DIET_VEGAN
DIET_VEGETARIAN

ContainmentLevelCode

指明食品中某种属性(例如过敏原或添加剂)的含量水平。

名称说明
CONTAINMENT_LEVEL_CODE_UNSPECIFIED请勿使用。未明确指定包含级别代码。
CONTAINMENT_LEVEL_CODE_CONTAINS
CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN
CONTAINMENT_LEVEL_CODE_MAY_CONTAIN

AllergenTypeCode

从 GS1 派生的过敏原类型:http://gs1.org/voc/AllergenTypeCode

名称说明
ALLERGEN_TYPE_CODE_UNSPECIFIED请勿使用。未明确指定过敏原类型代码。
ALLERGEN_TYPE_CODE_ALMONDS
ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE
ALLERGEN_TYPE_CODE_ALCOHOL
ALLERGEN_TYPE_CODE_AMYL_CINNAMAL
ALLERGEN_TYPE_CODE_ANISE_ALCOHOL
ALLERGEN_TYPE_CODE_BARLEY
ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL
ALLERGEN_TYPE_CODE_BENZYL_BENZOATE
ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE
ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE
ALLERGEN_TYPE_CODE_BRAZIL_NUTS
ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE
ALLERGEN_TYPE_CODE_CARROTS
ALLERGEN_TYPE_CODE_CASHEW_NUTS
ALLERGEN_TYPE_CODE_CELERY
ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN
ALLERGEN_TYPE_CODE_CINNAMAL
ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL
ALLERGEN_TYPE_CODE_CITRAL
ALLERGEN_TYPE_CODE_CITRONELLOL
ALLERGEN_TYPE_CODE_COCOA
ALLERGEN_TYPE_CODE_CORIANDER
ALLERGEN_TYPE_CODE_CORN
ALLERGEN_TYPE_CODE_COUMARIN
ALLERGEN_TYPE_CODE_CRUSTACEANS
ALLERGEN_TYPE_CODE_EGGS
ALLERGEN_TYPE_CODE_EUGENOL
ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA
ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI
ALLERGEN_TYPE_CODE_FARNESOL
ALLERGEN_TYPE_CODE_FISH
ALLERGEN_TYPE_CODE_GERANIOL
ALLERGEN_TYPE_CODE_GLUTEN
ALLERGEN_TYPE_CODE_HAZELNUTS
ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL
ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL
ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL
ALLERGEN_TYPE_CODE_KAMUT
ALLERGEN_TYPE_CODE_LACTOSE
ALLERGEN_TYPE_CODE_LUPINE
ALLERGEN_TYPE_CODE_MACADAMIA_NUTS
ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE
ALLERGEN_TYPE_CODE_MILK
ALLERGEN_TYPE_CODE_MOLLUSCS
ALLERGEN_TYPE_CODE_MUSTARD
ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS
ALLERGEN_TYPE_CODE_OAT
ALLERGEN_TYPE_CODE_PEANUTS
ALLERGEN_TYPE_CODE_PEAS
ALLERGEN_TYPE_CODE_PECAN_NUTS
ALLERGEN_TYPE_CODE_PISTACHIOS
ALLERGEN_TYPE_CODE_POD_FRUITS
ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS
ALLERGEN_TYPE_CODE_RYE
ALLERGEN_TYPE_CODE_SESAME_SEEDS
ALLERGEN_TYPE_CODE_SOYBEANS
ALLERGEN_TYPE_CODE_SPELT
ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE
ALLERGEN_TYPE_CODE_TREE_NUTS
ALLERGEN_TYPE_CODE_TREE_NUT_TRACES
ALLERGEN_TYPE_CODE_WALNUTS
ALLERGEN_TYPE_CODE_WHEAT

DepositCode

指明如何正确存放食品或瓶子。

名称说明
DEPOSIT_CODE_UNSPECIFIED请勿使用。未明确指定存款代码。
DEPOSIT_CODE_REUSABLE
DEPOSIT_CODE_RECYCLABLE

PropertyType

相应选项所适用的媒体资源类型。

名称说明
UNKNOWN_PROPERTY_TYPE请勿使用。未明确指定房源类型。
OPTION一种通用的菜单项选项属性,不属于以下任何更具体的类型。如果相应属性不是 SIZE 或 PIZZA_SIDE 类型,请使用此属性。
SIZE表示尺寸的菜单项选项属性(例如小号、中号或大号)。
PIZZA_SIDE披萨专属的媒体资源。例如:此 MenuItemOption 仅适用于部分/整个披萨,例如左侧、右侧或整个披萨上的蘑菇配料。

PropertyValue

选项属性的明确定义的值。

名称说明
UNKNOWN_PROPERTY_VALUE请勿使用。未明确指定属性值。
PIZZA_SIDE_LEFTMenuItemOption 仅适用于披萨的左半份。
PIZZA_SIDE_RIGHTMenuItemOption 仅适用于披萨的右半部分。
PIZZA_SIDE_WHOLEMenuItemOption 适用于整个披萨。

类型

字段名称类型要求说明
menu对象
(Menu)

sectionitemoption 互斥

section对象
(MenuSection)

menuitemoption 互斥

item对象
(MenuItem)

menusectionoption 互斥

option对象
(MenuItemOption)

menusectionitem 互斥

价格

菜单项必须具有价格或一组菜单项选项。 必填。

字段名称类型要求说明
offer_set对象
(OfferSet)

menu_item_option_set 互斥

可用于购买此食品的优惠。
menu_item_option_set对象
(MenuItemOptionSet)

offer_set 互斥

相应菜单项的可用选项。

必需的 oneof。

字段名称类型要求说明
amount数值

range 互斥

表示营养价值的单个数字。
range对象
(Range)

amount 互斥

表示营养价值的范围。

必填。

字段名称类型要求说明
property_val枚举
(PropertyValue)

text_val 互斥

选项属性的明确定义的值。目前仅当 property_type 为 PIZZA_SIDE 时才需要。
text_val对象
(TextField)

property_val 互斥

属性值的自由格式文本。对于 property_type OPTION 和 SIZE,这是预期值。