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

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

向用户展示的实际结果取决于查询解释的“置信度”。置信度基于几个因素,包括查询字符串出现在已编入索引的文档中的位置。当某个字符串(例如演员姓名“Tom Hanks”)持续出现在架构字段 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 创建属性名称、使用 objectDisplayLabel 创建对象名称,并使用 operatorName 创建运算符,以便创建直观的显示名称。

以下架构显示了“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 的 operatorName 为“genre”且 displayLabel 为“Category”。

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)
  • “action film”或“action films”会被解释为 genre:action objecttype:movies
  • “comedy category movies”会被解释为 genre:comedy objecttype:movies

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

您应为所有日期和数值属性定义 IntegerOperatorOptions 中指定的 lessThanOperatorNamegreaterThanOperatorName。借助这些设置可自动得出日期和数字解释。此外,如需启用排序解释,请为日期和数字属性设置 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 released this year”会被解释为 objecttype: movies releasedafter:2019-1-1 releasedbefore:2019-12-31
  • 假设本周是 3 月的第三周,因此“movies released last week”会被解释为 objecttype: movies releasedafter:2019-3-10 releasedbefore:2019-3-16
  • “movies with runtime less than 90”会被解释为 objjecttype: movies runtimelessthan:90
  • 假设今年是 2019 年,因此“movies released this year and length more than 120”会被解释为 releasedafter:2019-1-1 releasedbefore:2019-12-31 objecttype:movies runtimegreaterthan:120
  • “sort movies by release date”会按“objecttype: movies”进行过滤,显示的结果将按发布日期升序(默认值)排序。

启用预留的运算符解释

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

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

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

查询解释限制

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

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