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
的文档,请使用以下语法:

该基本查询在 :
操作符之前包含一个嵌套路径表达式。 每个路径元素都是文档中一个字段的名称,以句号(.
)分隔。:
操作符表示操作符后面的文本必须包含在结果中。
::
操作符表示文本必须在结果中完全匹配。 有关详细信息,请参阅 查询操作符。 您可以在下面的示例中看到这两个运算符是如何使用的。
-
要按相关性顺序返回匹配文档,请在
POST
请求中传递以下数据对象:{ "query":"enriched_text.entities.text:IBM" }
-
要按任意顺序返回匹配文档,请在
POST
请求中传递以下数据对象作为查询正文:{ "filter":"enriched_text.entities.text::IBM" }
同时使用过滤器和查询参数
filter
参数的返回速度比 query
参数快,而且其结果会被缓存。 如果您在一个小数据集上分别提交使用 filter
和 query
参数的查询,每个请求都会返回类似(如果不是完全相同)的结果。
在大型数据集中,如果需要按相关性顺序返回结果,可将 filter
和 query
参数组合使用。 同时使用这些参数可提高性能,因为 filter
参数会首先应用。 它可以过滤文件并缓存结果。 query
参数随后对缓存结果进行排序。
过滤器示例:根据 ID 获取文档
查询主体:
{
"filter": "document_id::b6d8c6e3-1097-421b-9e39-75717d2554aa"
}
如果文档存在,查询会返回 1 个匹配结果。 如果没有,查询将不返回匹配结果。
过滤器示例:根据文件名查找文件 ID
如果您不知道文档的 document_id
,但知道文档的原始 filename
,您可以使用 filter
和 return
参数一起发现 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.text
是 Gilroy
和某些路径 enriched_text.entities.type::Location
是 Location
的文档。 但是,并不能保证这两条路径位于同一个 entities
对象之下。 例如,查询匹配的文档中,Gilroy
是
Person
实体类型,同时又有其他一些 Location
实体类型对象。
为准确捕捉该查询的嵌套语义,请使用以下语法嵌套过滤器值:
查询主体:
{
"filter": "enriched_text.entities:(text::Gilroy,type::Location)"
}
这种更严格的查询只匹配存在 entities
对象且 text
等于 Gilroy
和 type
等于 Location
的文档。
再比如,如果您要匹配包含 entities
对象的文档,其中 text
等于 Gilroy
但 type
not 等于 Location
,您可以在查询中使用
not equal 操作符:
{
"filter": "enriched_text.entities:(text::Gilroy,type::!Location)"
}
您还可以使用聚合对结果进行更复杂的过滤。 有关可用聚合类型的更多信息,请参阅 查询聚合。
如需了解有关 Discovery 查询语言的更多信息,请参阅以下主题: