IBM Cloud Docs
DQL 概述

DQL 概述

Discovery 查询语言定义了用于过滤、搜索和分析数据的语法。

如何编写 Discovery 查询语言查询

Discovery 查询语言利用了索引文档的结构。 下面的 JSON 代码段显示了应用 Entities 丰富功能的一个集合中的索引文档。 经过丰富后,JSON 结构可以捕捉到任何已知实体的信息,如城市名称、公司或名人。

在本例中,识别的实体是公司名称 IBM

{
  "document": {
    "document_id": "f7f27ea30eb3e4c0ce21830618d9ee99",
    "enriched_text": [
      {
        "entities": [
          {
            "model_name": "natural_language_understanding",
            "mentions": [],
            "text":"IBM",
            "type":"Organization"
          }
        ]
      }
    ]
  }
}

要创建一个查询,返回所有提到实体 IBM 的文档,请使用以下语法:

查询 enriched_text.entities.text:IBM的结构,其中 enriched_text 中的文本是应用了增益的字段,而 IBM 是您要在 enriched_text.entities.text 子字段中查找的术语。
Example query structure

该基本查询在 : 操作符之前包含一个嵌套路径表达式。 每个路径元素都是文档中一个字段的名称,以句号(.)分隔。: 操作符表示操作符后面的文本必须包含在结果中。

:: 操作符表示文本必须在结果中完全匹配。 有关详细信息,请参阅 查询操作符。 您可以在下面的示例中看到这两个运算符是如何使用的。

  • 要按相关性顺序返回匹配文档,请在 POST 请求中传递以下数据对象:

    {
      "query":"enriched_text.entities.text:IBM"
    }
    
  • 要按任意顺序返回匹配文档,请在 POST 请求中传递以下数据对象作为查询正文:

    {
      "filter":"enriched_text.entities.text::IBM"
    }
    

同时使用过滤器和查询参数

filter 参数的返回速度比 query 参数快,而且其结果会被缓存。 如果您在一个小数据集上分别提交使用 filterquery 参数的查询,每个请求都会返回类似(如果不是完全相同)的结果。

在大型数据集中,如果需要按相关性顺序返回结果,可将 filterquery 参数组合使用。 同时使用这些参数可提高性能,因为 filter 参数会首先应用。 它可以过滤文件并缓存结果。 query 参数随后对缓存结果进行排序。

过滤器示例:根据 ID 获取文档

查询主体:

{
  "filter": "document_id::b6d8c6e3-1097-421b-9e39-75717d2554aa"
}

如果文档存在,查询会返回 1 个匹配结果。 如果没有,查询将不返回匹配结果。

过滤器示例:根据文件名查找文件 ID

如果您不知道文档的 document_id,但知道文档的原始 filename,您可以使用 filterreturn 参数一起发现 document_id

查询主体:

{
  "filter": "extracted_metadata.filename::100674.txt",
  "return": [ "document_id", "extracted_metadata" ]
}

回复:

{
  "matching_results": 1,
  "results": [
    {
      "document_id": "b6d8c6e3-1097-421b-9e39-75717d2554aa",
      "extracted_metadata": {
        "sha1": "AD447F7592A17CDCBF0A589C4E6EC2087AF7H35F",
        "filename": "100674.txt",
        "file_type": "text"
      }
    }
  ]
}

过滤器示例查找提及实体值的文件

该查询查找提及实体 Gilroy 的文档,并找到 4 个匹配文档。

查询主体:

{
  "filter": "enriched_text.entities.text::Gilroy"
}

回复:

{
  "matching_results": 4
}

过滤嵌套值

您可以将一个过滤器嵌套在另一个过滤器中,以确保返回的文档符合多个条件。

在这些示例使用的文档中,实体 "Gilroy" 同时作为 "Location" (加利福尼亚州的一个小镇)和 "Person" (一个姓氏)实体类型出现。 要查找 "Gilroy" 作为位置出现的文档,请编写一个查询,同时对两个嵌套字段进行筛选:实体文本必须是 "Gilroy",实体类型必须是 "Location"

查询语句如下:

{
  "filter": "enriched_text.entities.text::Gilroy,enriched_text.entities.type::Location"
}

此查询会匹配某些路径 enriched_text.entities.textGilroy 和某些路径 enriched_text.entities.type::LocationLocation 的文档。 但是,并不能保证这两条路径位于同一个 entities 对象之下。 例如,查询匹配的文档中,GilroyPerson 实体类型,同时又有其他一些 Location 实体类型对象。

为准确捕捉该查询的嵌套语义,请使用以下语法嵌套过滤器值:

查询主体:

{
  "filter": "enriched_text.entities:(text::Gilroy,type::Location)"
}

这种更严格的查询只匹配存在 entities 对象且 text 等于 Gilroytype 等于 Location 的文档。

再比如,如果您要匹配包含 entities 对象的文档,其中 text 等于 Gilroytype not 等于 Location,您可以在查询中使用 not equal 操作符:

{
  "filter": "enriched_text.entities:(text::Gilroy,type::!Location)"
}

您还可以使用聚合对结果进行更复杂的过滤。 有关可用聚合类型的更多信息,请参阅 查询聚合

如需了解有关 Discovery 查询语言的更多信息,请参阅以下主题: