设计架构的结构以获得最优查询解释

Cloud Search 查询解释功能可自动将用户查询中的运算符和过滤条件转换为基于运算符的结构化查询。该功能使用架构中定义的运算符和已编入索引的文档来推断查询意图。这样,用户只需使用最少的关键字即可获得精确的搜索结果。

结果的呈现方式取决于置信度。如果查询字符串持续出现在特定架构字段中(例如,actors 字段中的“汤姆·汉克斯”)。当字符串出现在一般散文中时,置信度会降低。如果置信度较高,系统只会显示解释结果;如果置信度较低,系统会将解释结果与标准关键字搜索结果混合显示。

查询解释示例

假设有一个包含电影信息的数据库。图 1 展示了一个示例搜索查询及其解释。

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

在此示例中,查询解释功能:

  • 根据架构确定顶级对象为 objecttype:movies
  • 扫描文档以确定“action”的出现位置。如果该字符串主要出现在 genre 字段中,则可以更确信它是该字段的属性值。

得出的解释如下: actor:"tom hanks" genre:action objecttype:movies

所有用户都可以自动进行查询解释,但您可以按照以下部分所述来构建架构,从而优化查询解释。

设计架构的结构以支持查询解释功能

优化架构可确保您充分利用查询解释功能。

启用显示名称解释

查询解释使用 objectDefinitionspropertyDefinitions 来解释查询。使用 displayLabel(针对属性)、objectDisplayLabel(针对对象)和 operatorName(针对运算符)创建直观的显示名称。

此示例显示了“movie”对象的直观显示名称:

{
  "objectDefinitions": [{
    "name": "movie",
    "options": {
      "displayOptions": { "objectDisplayLabel": "Films" }
    },
    "propertyDefinitions": [{
      "name": "genre",
      "isReturnable": true,
      "textPropertyOptions": {
        "operatorOptions": { "operatorName": "genre" }
      },
      "displayOptions": { "displayLabel": "Category" }
    }]
  }]
}

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

  • “动作片” -> genre:action object:movies
  • “movies with genre action or thriller” -> objecttype:movies genre:(action OR thriller)
  • “喜剧类电影” -> genre:comedy objecttype:movies

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

IntegerOperatorOptions 中为所有日期和数值属性定义 lessThanOperatorNamegreaterThanOperatorName。如需启用排序,请设置 isSortable

此示例启用了以下选项:

{
  "objectDefinitions": [{
    "propertyDefinitions": [
      {
        "name": "runtime",
        "isSortable": true,
        "integerPropertyOptions": {
          "operatorOptions": {
            "operatorName": "runtime",
            "lessThanOperatorName": "runtimelessthan",
            "greaterThanOperatorName": "runtimegreaterthan"
          }
        }
      },
      {
        "name": "releasedate",
        "isSortable": true,
        "datePropertyOptions": {
          "operatorOptions": {
            "operatorName": "releasedate",
            "lessThanOperatorName": "releasedbefore",
            "greaterThanOperatorName": "releasedafter"
          }
        }
      }
    ]
  }]
}

借助这些设置,系统可以得出以下解译:

  • “movies released this year”(今年上映的电影)-> objecttype:movies releasedafter:2019-1-1 releasedbefore:2019-12-31
  • “movies with runtime less than 90” -> objecttype:movies runtimelessthan:90

启用预留的运算符解释

使用 typebeforeafterobjecttype 等内置运算符:

  1. ItemMetadata 中填充 updateTime,以使用 beforeafter
  2. ItemMetadata 中填充 mimeType 以进行自动检测。例如,“动作视频”会列出具有视频 MIME 类型的文档。

查询解释限制

  • 仅适用于以下数据源 ACL:
    • 网域公开。
    • 数据源公开。
    • 大多数文档共享相同的继承 ACL。
  • 共享的运算符名称(例如 priorityseverity 都使用 0-3)较低的置信度。
  • 默认情况下,除非您使用 exactMatchWithOperator,否则解读会使用小写形式的字段值。
  • 不支持 source 运算符。
  • 组合使用运算符和自由文本术语(例如,“p0 cases severity:s0”)不会被解读。
  • 结果始终与按相关性排名的结果混合。