构建架构以获得最优查询解释

Cloud Search 的“查询解释”功能可自动解释用户查询中的运算符和过滤条件,并将这些元素转换为基于运算符的结构化查询。“查询解释”使用架构中定义的运算符并结合已编入索引的文档推断出用户查询的含义。此功能可让用户使用最少的关键字进行搜索,但仍然能够获得精确的结果。

向用户展示的实际结果取决于查询解释的“置信度”。置信度基于几个因素,包括查询字符串出现在已编入索引的文档中的位置。一个字符串,如 他叫汤姆·汉克斯持续出现在 schema 字段(名为 actors)可以提高置信度。当“Tom Hanks”这个字符串出现在段落中而非架构字段中时,得出的置信度较低。如果置信度较高,系统只会将查询解释的结果显示给用户。如果置信度较低,则查询解释的结果会与常规关键字搜索结果融合。

查询解释示例

假设您有一个包含影片相关信息的数据源(例如数据库)。图 1 展示了一个示例搜索查询和得出的解释。

查询解释概览
图 1. 查询解释

执行此查询示例后,查询解释功能将执行以下操作:

  • 解析架构并确定数据源中的顶级对象 被归类为 objecttype:movies。查询解释功能现在知道查询中的“movies”是指对象类型。

  • 在数据源中扫描文档,并将结果与架构结合使用来确定字符串“action”的出现位置。如果该字符串主要出现在特定的“genre”数据源字段中,则查询解释可以确信“action”是架构中所定义属性“genre”的属性值。如果该字符串主要出现在内容段落的上下文中,则查询解释的置信度会降低。

得出的查询解释如下:

  actor:“tom hanks” genre:action objecttype:movies

所有 Cloud Search 客户都会自动启用查询解释功能,您不需要进行额外操作。但是,要获得最佳的查询解释,您应按照本文档中的说明来构建架构。

构建架构以支持查询解释功能

您应该构建架构以确保可以充分利用查询解释功能。

启用显示名称解释

Cloud Search 的查询解释功能利用 objectDefinitionspropertyDefinitions 来解释用户的查询并调整 结果。为充分发挥这些架构元素的优势,您应创建 直观的显示名称 displayLabel 属性的名称 objectDisplayLabeloperatorName 表示运算符。

以下架构显示了“movie”对象的直观显示名称:

{
  "objectDefinitions": [
    {
      "name": "movie",
        "options": {
          "displayOptions": {
          "objectDisplayLabel": "Films"
        }
        ...
      },
      "propertyDefinitions": [
        {
          "name": "genre",
          "isReturnable": true,
          "isRepeatable": true,
          "isFacetable": true,
          "textPropertyOptions": {
          "retrievalImportance": { "importance": "HIGHEST" },
          "operatorOptions": {
            "operatorName": "genre"
          }
        },
        "displayOptions": {
          "displayLabel": "Category"
        }
      },
      ...
      ]
    }
  ]
}

在上述示例中:

  • movie 对象定义的 objectDisplayLabel 为“Film”。

  • genre propertyDefinition 的“genre”operatorName 和“Category” displayLabel

Cloud Search 可使用这些显示名称得出以下查询解译:

  • “action movies”(动作电影)、“genre action type movies”(动作类型电影)或“movies genre action”(电影类型动作) 解释为 genre:action object:movies
  • “movies with genre action or thriller”会被解释为 objecttype:movies genre:(action OR thriller)
  • “动作片”或“动作片”会被解释为 genre:action objecttype:movies
  • “喜剧类电影”会被解读为 genre:comedy objecttype:movies

启用日期、数值和排序解释

您应定义 lessThanOperatorNamegreaterThanOperatorName, 指定 IntegerOperatorOptions,所有日期和 数值属性。借助这些设置可自动得出日期和数字解释。此外,如需启用排序解释 为日期和数值属性设置 isSortable 选项。以下架构显示了如何启用这些选项。

{
  "objectDefinitions": [
    {
      "options": {
        "displayOptions": {
          "objectDisplayLabel": "Films"
        }
      },
      "propertyDefinitions": [
        {
          "name": "runtime",
          "isReturnable": true,
          "isSortable": true,
          "integerPropertyOptions": {
            "orderedRanking": "DESCENDING",
            "minimumValue": {
              "value": 10
            },
            "maximumValue": {
              "value": 500
            },
            "operatorOptions": {
              "operatorName": "runtime",
              "lessThanOperatorName": "runtimelessthan",
              "greaterThanOperatorName": "runtimegreaterthan"
            }
          },
          "displayOptions": {
            "displayLabel": "Length"
          }
        },
        {
          "name": "releasedate",
          "isReturnable": true,
          "isSortable": true,
          "datePropertyOptions": {
            "operatorOptions": {
              "operatorName": "releasedate",
              "lessThanOperatorName": "releasedbefore",
              "greaterThanOperatorName": "releasedafter"
            }
          }
        }
      ]
    }
  ]
}

在上述示例中:

  • 数字属性 runtime 是指电影的时长。通过 已为此属性设置 runtimelessthanruntimegreaterthan
  • 日期属性 releaseDate 是指电影的 影院。为此属性设置了 releasedbeforereleasedafter

这些设置可让 Cloud Search 得出以下查询解译:

  • 假设今年是 2019 年,系统会将“movies Releases this year”(今年发行的电影)解释为 objecttype: movies releasedafter:2019-1-1 releasedbefore:2019-12-31
  • 假设本周是 3 月的第三周,“上周上映的电影”是指 解释为 objecttype: movies releasedafter:2019-3-10 releasedbefore:2019-3-16
  • “movies with runtime less than 90”会被解释为 objjecttype: movies runtimelessthan:90
  • 假设今年是 2019 年,“今年上映的电影 120”会被解释为 releasedafter:2019-1-1 releasedbefore:2019-12-31 objecttype:movies runtimegreaterthan:120
  • “sort movies by release date”会按“objecttype: movies”进行过滤,显示的结果将按发布日期升序(默认值)排序。

启用预留的运算符解释

您还可以使用 typebeforeafterobjecttype 预留的内置函数 以增强查询解释功能。将文档编入索引时,请执行以下操作:

  1. 填充updateTime ItemMetadata 使用 beforeafter 运算符。这些设置可让 Cloud Search 得出以下查询解译:

    • “movies from last week”会列出上周在索引中更新的所有影片。
    • “movies before jan 2019”会列出在 2019 年 1 月之前编入索引的所有影片。
  2. 填充 ItemMetadata 中的 mimeType 字段以使用自动检测 类型。查询“action videos”会列出包含 MIME 的所有动作电影文档 application/mp4application/mpeg4application/x-shockwave-flash 的类型, video/application/vnd.google-apps.video

查询解释限制

查询解释功能具有以下限制。

  • 查询解释仅适用于以下数据源 ACL: <ph type="x-smartling-placeholder">
      </ph>
    • 所有文档在网域中都是公开的(网域中的每个人都可以访问文档)。
    • 所有文档都是公开的数据源(每个人都可以访问数据源 ACL)。
    • 数据源中大多数文档的 ACL 都相同(所有文档都从相同的容器项继承 ACL),无需定义额外的读取者。
  • 如果多个架构运算符具有相同的值,则是否向查询中的运算符意图解释该值,取决于查询解释系统返回的整体置信度因素。例如,假设您 具有具有相同运算符名称的属性 priorityseverity 架构中定义的再假设这两个运算符都可以具有值 0、1、2 或 3。 在此示例中,可以引用任意一项的运算符值 priorityseverity。这些值含糊不清,因此置信度较低。
  • 默认情况下,Cloud Search 的查询解释功能会降低字段大小写 值,但使用 exactMatchWithOperator选项。
  • 查询不支持 source 运算符。
  • 系统不会解释同时包含基于运算符的术语和自由文本术语的查询。例如,不支持查询“p0 priority cases severity:s0”,因为“p0 priority cases”是自由文本术语,而“severity:s0”是基于运算符的术语。
  • 查询解释策略始终将解释结果与普通结果(非解释结果,按相关性排名)混合,而不是对这些结果进行整页替换。