查询聚集
使用聚集对查询请求返回的结果进行分组,分析或比较。
聚集由您可以在查询 API 中指定的 aggregation
参数定义。 聚集参数的输入是从指定为同一查询请求中的单独参数的 query
,filter
或 natural_language_query
参数返回的文档集。 否则,聚集将应用于项目中的所有文档。
您可以使用聚集从结果文档集中的值执行计算。 例如,要在作为查询结果返回的文档的 order.total
字段中获取有关最高美元金额的信息,请使用 max(order.total)
作为 aggregation
参数的值。
{: caption="分组聚合查询结构" caption-side="bottom"}
聚集参数返回有关具有最高值的字段的数据。
"aggregations": [
{
"type": "max",
"field": "order.total",
"value": 100668.00
}
]
对文档进行分组
除了执行计算外,还可以使用聚集对结果集中与特定值匹配的文档进行分组,以便对其进行计数或进一步分析。 例如,您可以使用聚集来搜索一组交通事件报告,以查找提及术语 brake
的文档。 而从返回的文件中,找到美国各州对该术语最相关的提及的报告。
在以下示例请求中,将包含仅返回 3 聚集结果的 count 参数,以使示例更易于遵循。
{
"query":"brake",
"aggregation": "term(field:STATE,count:3,relevancy:true)"
}
聚集参数的输出将返回在 aggregations
对象中,该对象显示在包含查询结果的 results
对象之前。 对于单个查询,最多可以在 aggregations
对象中返回 50,000 个值。
生成的 aggregations
对象包含有关查询结果的摘要信息。 例如,在此示例中,它显示来自纽约,加利福尼亚和佛罗里达的交通事件报告具有术语 brake
的最相关提及项。
{
"matching_results": 9064,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "term",
"field": "STATE",
"results": [
{
"key": "NY",
"matching_results": 693,
"relevancy": 1.1649531567631084,
"total_matching_documents": 2156,
"estimated_matching_results": 542
},
{
"key": "CA",
"matching_results": 1210,
"relevancy": 1.1170819184294765,
"total_matching_documents": 4017,
"estimated_matching_results": 1011
},
{
"key": "FL",
"matching_results": 511,
"relevancy": 0.828014956418841,
"total_matching_documents": 2199,
"estimated_matching_results": 553
}
]
}
],
"results": []
组合聚集类型
您可以使用不同类型的聚集来分析或分组查询结果。 您可以在一个请求中组合多个聚合,以执行更有针对性的分析。
以下示例显示了由两个术语运算符组成的请求。 第一个术语聚集按美国状态值对输入文档进行分组,然后选择 3 组。 第二个术语聚集将应用于这些 3 组中的每个组,并按 CITY 的值对其进行进一步分组。 每个 STATE 组仅返回其中的 2 个 CITY 子组。
正在排除相关性参数以使结果更易于读取。
{
"query":"brake",
"aggregation": "term(field:STATE,count:3).term(field:CITY,count:2)"
}
响应包含来自每个州的城市信息。
{
"matching_results": 9064,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 3,
"results": [
{
"key": "CA",
"matching_results": 1210,
"aggregations": [
{
"type": "term",
"field": "CITY",
"count": 2,
"results": [
{
"key": "LOS ANGELES",
"matching_results": 77
},
{
"key": "SAN DIEGO",
"matching_results": 66
}
]
}
]
},
{
"key": "NY",
"matching_results": 693,
"aggregations": [
{
"type": "term",
"field": "CITY",
"count": 2,
"results": [
{
"key": "BROOKLYN",
"matching_results": 35
},
{
"key": "NEW YORK",
"matching_results": 21
}
]
}
]
},
{
"key": "FL",
"matching_results": 511,
"aggregations": [
{
"type": "term",
"field": "CITY",
"count": 2,
"results": [
{
"key": "JACKSONVILLE",
"matching_results": 33
},
{
"key": "TAMPA",
"matching_results": 29
}
]
}
]
}
]
}
],
"results": []
指定聚集重要性的顺序。 例如,如果从上一个示例反转术语聚集的顺序,那么会获得不同的结果。
{
"query":"brake",
"aggregation": "term(field:CITY,count:3).term(field:STATE,count:1)"
}
新订单生成的结果会显示芝加哥,这是一个未包含在先前结果集中的城市。 当请求按州分组启动时,结果中不包含伊利诺伊州 (仅包含一个具有大量交通事件报告的城市)。 纽约和佛罗里达都有不止一个城市有许多事件报告,因此产生了更多的全州范围的比赛,因此被退回。 当您先按城市分组时,结果会发生变化。
{
"matching_results": 9064,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "term",
"field": "CITY",
"count": 4,
"results": [
{
"key": "LOS ANGELES",
"matching_results": 77,
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 1,
"results": [
{
"key": "CA",
"matching_results": 77
}
]
}
]
},
{
"key": "SAN DIEGO",
"matching_results": 66,
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 1,
"results": [
{
"key": "CA",
"matching_results": 66
}
]
}
]
},
{
"key": "CHICAGO",
"matching_results": 59,
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 1,
"results": [
{
"key": "IL",
"matching_results": 59
}
]
}
]
}
]
}
],
"results": []
使用聚集来探索扩充项
term()
聚集对于分析结果以确定在文档中识别的扩充项数特别有用。 例如,要计算每种实体类型在已过滤文档中被识别的次数,您可以提交以下查询参数:
{
"filter": "enriched_text.entities:(text::Gilroy,type::Location)",
"aggregation": "term(enriched_text.entities.type)"
}
查询首先选择具有至少一个类型为 Location
且文本为 Gilroy
的实体的文档。 此操作将返回 3 文档。 从返回的文档中,聚集将计算每个实体类型出现的文档数。
{
"matching_results": 3,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "term",
"field": "enriched_text.entities.type",
"results": [
{
"key": "Location",
"matching_results": 3
},
{
"key": "Person",
"matching_results": 3
},
{
"key": "Company",
"matching_results": 2
},
{
"key": "GeographicFeature",
"matching_results": 2
},
{
"key": "Organization",
"matching_results": 2
},
{
"key": "Quantity",
"matching_results": 2
},
{
"key": "Facility",
"matching_results": 1
},
{
"key": "PrintMedia",
"matching_results": 1
}
]
}
]
}
3 匹配的文档都具有 Location
和 Person
实体类型 ("matching_results": 3
)。但是,只有 2 个匹配文档具有 Company
实体类型。
缺省情况下,将返回按相关性排序的前 10 个匹配项。 您可以通过将 count
参数添加到聚集来更改结果数。
{
"filter": "enriched_text.entities:(text::Gilroy,type::Location)",
"aggregation": "term(enriched_text.entities.type,count:20)"
}
添加过滤器
使用聚集子句中的 filter()
来过滤结果。 例如,您可以直接在 aggregation
子句中指定在上一个示例中单独提交的相同过滤器。
{
"aggregation": "filter(enriched_text.entities:(text::Gilroy,type::Location)).term(enriched_text.entities.type)"
}
在这种情况下,filter().term()
聚集将使用单独的 filter
和 aggregation
子句来查找与先前示例相同的结果。 但是,使用 filter
子句时,结果的排名不同。 您可以通过在 aggregation
子句中使用 filter()
子句来过滤表达式序列中的结果来利用此差异,如下一个示例中所示。
从嵌套对象开始
在以上示例中,"matching_counts"
值表示与过滤器和聚集匹配的文档数。 您可能想要计算查询响应中存在的 嵌套 对象数。 nested()
聚集允许您更改用作其他聚集术语的输入的文档集。
例如,在以下查询中,nested()
段选择所有 enriched_text.entities
嵌套对象作为 filter()
和 term()
段使用的输入。
{
"aggregation": "nested(enriched_text.entities).filter(enriched_text.entities.type::Organization).term(enriched_text.entities.text,count:3)"
}
查询将生成如下所示的 aggregations
对象:
{
"aggregations": [
{
"type": "nested",
"path": "enriched_text.entities",
"matching_results": 1993,
"aggregations": [
{
"type": "filter",
"match": "enriched_text.entities.type::Organization",
"matching_results": 645,
"aggregations": [
{
"type": "term",
"field": "enriched_text.entities.text",
"count": 3,
"results": [
{
"key": "IBM",
"matching_results": 36
},
{
"key": "Docker",
"matching_results": 12
},
{
"key": "OpenShift",
"matching_results": 12
}
]
}
]
}
]
}
]
}
查询的 nested()
段找到 1993 enriched_text.entities
个嵌套对象。 过滤器已应用于这些对象,找到类型为 Organization
的 645 enriched_text.entities
。
终端运营
对于大多数聚集类型,当您构造具有多个聚集操作的查询时,第一个操作将应用于文档。 然后,该操作的输出将用作下一个操作的输入。 但是,聚集类型的子集是 终端操作。 终端操作的输出不用作下一次聚集的输入。 而是在离散组中返回输出。
有关组合聚集类型并包含执行终端操作的聚集的请求的示例,请参阅 average
聚集类型的第二个 示例。
聚集类型
支持以下类型的聚合:
对于“文档检索”项目类型,如果未在查询请求中包含聚集参数,那么将应用缺省聚集请求。 有关更多信息,请参阅 文档检索项目聚集。
有关如何提交查询的更多信息,请参阅 Discovery API 参考。
平均
返回所有匹配文档中指定字段的平均值。
语法
average(field)
示例
产品 | 价格 |
---|---|
I 系列 | 200 |
J 系列 | 450 |
X 系列 | 325 |
当 average
聚集类型应用于其中 price
字段包含表 1 中显示的值的一组文档时,结果为 325
。
average(price)=325
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
{
"query":"brake",
"aggregation": "term(field:STATE,count:3).average(field:VEH_SPEED).term(field:CITY,count:2)"
}
对于第一个 term
聚集操作返回的每个状态,响应会显示突发事件报告中指定的平均车速。 请注意,第二个 term
聚集使用第一个 term
聚集 (而不是 average
聚集) 的输出作为其输入。
{
"matching_results": 9064,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 3,
"results": [
{
"key": "CA",
"matching_results": 1210,
"aggregations": [
{
"type": "average",
"field": "VEH_SPEED",
"value": 26.239653512993264
},
{
"type": "term",
"field": "CITY",
"count": 2,
"results": [
{
"key": "LOS ANGELES",
"matching_results": 77
},
{
"key": "SAN DIEGO",
"matching_results": 66
}
]
}
]
}
过滤器
一个修饰符,用于缩小其前面的聚集查询的文档集。
语法
filter(field)
示例
以下示例过滤匹配文档集以仅包含提及 IBM
的文档。
filter(enriched_text.entities.text:IBM)
与其他聚集组合时,过滤匹配的文档集以仅包含满足您指定的条件的那些文档。
{
"query":"brake",
"aggregation": "filter(VEH_SPEED>50).term(field:STATE,count:3).term(field:CITY,count:2)"
}
查询响应显示发生涉及刹车且车速超过 50 的事件的城市。
{
"matching_results": 9064,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "filter",
"match": "VEH_SPEED>50",
"matching_results": 1075,
"aggregations": [
{
"type": "term",
"field": "STATE",
"count": 3,
"results": [
{
"key": "CA",
"matching_results": 176,
"aggregations": [
{
"type": "term",
"field": "CITY",
"count": 2,
"results": [
{
"key": "FONTANA",
"matching_results": 6
},
{
"key": "ALTA LOMA",
"matching_results": 5
}
]
}
]
}
group_by
将结果分隔为您定义的组。
语法
group_by(condition:[(condition 1),(condition 2)...])
必须将每个条件指定为用括号括起来的有效发现查询语言表达式。 例如,(age<20)
或 (flavor:chocolate)
。 可以定义的最大条件数为 50。
您可以选择包含 relevancy
参数并将其设置为 true
,以返回满足指定条件的文档集的相关性值。 设置为 true
时,将按相关性对结果进行排序。 如果设置为 false
,那么结果将按 matching_results
的最大数目排序。
示例
以下请求将查找提及术语 engine
的文档,并按汽车制造年份对其进行分组。 这些文档分为 3 组,一组涉及 2000 年之前制造的汽车的交通事故报告,一组针对 2000 年制造的汽车,一组针对 2000 年之后制造的汽车。
{
"query":"engine",
"aggregation": "group_by(condition:[(YEARTXT<2000),(YEARTXT=2000),(YEARTXT>2000)],relevancy:true)"
}
结果可能如下所示:
{
"type": "group_by",
"results": [
{
"key": "YEARTXT<2000",
"matching_results": 2034,
"relevancy": 1.0,
"total_matching_documents": 2034,
"estimated_matching_results": 2034
},
{
"key": "YEARTXT=2000",
"matching_results": 1738,
"relevancy": 1.0,
"total_matching_documents": 1738,
"estimated_matching_results": 1738
},
{
"key": "YEARTXT>2000",
"matching_results": 32708,
"relevancy": 1.0,
"total_matching_documents": 32708,
"estimated_matching_results": 32708
}
]
}
柱状图
创建数字间隔分段来对文档进行分类。
语法
histogram({field},{interval})
使用单个数字字段中的字段值来描述类别。 用于创建直方图的字段必须具有数字数据类型,例如 integer
,float
,double
或 date
。
不支持 string
等非数字类型。 例如,"price": 1.30
是一个数字值,可以正常工作,而 "price": "1.30"
是一个字符串,因此无法正常工作。
使用 interval
参数定义结果分割的段的大小。 区间值必须是整数,非负数。 选择对字段中的典型值进行分段时有意义的值。
直方图可以处理字段中指定的十进制值,但时间间隔必须是整数。
您可以选择通过包含 name
参数来包含定制名称。
示例
例如,如果数据集包含多个商品的价格,例如: “price”: 1.30
,“price”: 1.99
和 “price”: 2.99
,那么可以使用时间间隔 1
,以便您可以看到在范围 1 - 2
以及 2
和 3
中分组的所有商品。 您不希望使用时间间隔 100
,因为所有数据最终都在同一段中。
histogram(product_price,interval:1)
max
返回所有匹配文档中指定字段的最大值。
语法
max(field)
示例
产品 | 价格 |
---|---|
I 系列 | 200 |
J 系列 | 450 |
X 系列 | 325 |
当 max
聚集类型应用于其中 price
字段包含表 2 中显示的值的一组文档时,结果为 450
。
max(price)=450
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
min
返回所有匹配文档中指定字段的最小值。
语法
min(field)
示例
产品 | 价格 |
---|---|
I 系列 | 200 |
J 系列 | 450 |
X 系列 | 325 |
当 min
聚集类型应用于其中 price
字段包含表 3 中显示的值的一组文档时,结果为 200
。
min(price)=200
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
嵌套
在聚合查询前应用 nested
,可将聚合限制在指定结果区域。
例如,nested(enriched_text.entities)
表示仅使用任何结果的 enriched_text.entities
部分进行聚合。
以下示例检查每种模型类型返回的提及项数。
nested(enriched_text.entities).term(enriched_text.entities.model_name)
结果显示共有 50 个已识别实体,所有这些实体都是 NLU 类型。
"aggregations": [
{
"type": "nested",
"path": "enriched_text.entities",
"matching_results": 50,
"aggregations": [
{
"type": "term",
"field": "enriched_text.entities.model_name",
"results": [
{
"key": "natural_language_understanding",
"matching_results": 50
}
]
}
]
}
]
有关另一个示例,请参阅 从嵌套对象开始。
一对
分析两个字段之间的关系。
语法
pair(first:{aggregation},second:{aggregation})
第一个和第二个 {aggregation}
值必须是下列其中一种聚集类型:
term
group_by
histogram
timeslice
将忽略 term
或 group_by
聚集中的 relevancy
参数。 pair
聚集类型通过使用来自两个聚集的结果的文档集组合来计算相关性值。
每个查询请求只能使用一个对聚集,并且不能将其与任何其他聚集组合。
示例
例如,您可以将 term(model_name)
指定为第一个聚集,将 term(component_name)
指定为第二个聚集。 每个聚集都将以下值作为聚集文档集的键返回:
- 术语 (model_name): 协议,CR-V
- 术语 (component_name): 引擎,制动器,散热器
每个文档集的组合的计算相关性值可能如下所示:
- 符合 x 引擎
- 一致 x 制动器
- 协和 x 散热器
- CR-V x 引擎
- CR-V x 制动器
- CR-V x 散热器
响应定义聚集结果的二维数组,该数组可以在表中表示。
汽车模型 | 组件: 引擎 | 部件: 制动器 | 组件: 散热器 |
---|---|---|---|
一致 | 符合 x 引擎 | 一致 x 制动器 | 协和 x 散热器 |
CR-V | CR-V x 引擎 | CR-V x 制动器 | CR-V x 散热器 |
表的每个列和行数组按第一次和第二次聚集的结果的相同顺序进行排序。 例如,如果将 term
聚集指定为第一个自变量,那么生成的列数组将按项的频率排序。 如果使用 timeslice
聚集作为第二个自变量,那么将按日期或时间对行数组进行排序。
总和
在所有匹配文档中添加指定字段的值。
语法
sum(field)
示例
产品 | 价格 |
---|---|
I 系列 | 200 |
J 系列 | 450 |
X 系列 | 325 |
当 sum
聚集类型应用于其中 price
字段包含表 6 中显示的值的一组文档时,结果为 975
。
sum(price)=975
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
期限
指示一组已查询文档中的术语或术语集的频率。
语法
term(field:{field_name})
您可以选择指定以下参数:
-
count
:指定要返回的最大词条数。 -
name
: 您可以选择包含定制名称。 如果请求中包含相关性信息,那么不会返回此值。 -
relevancy
: 指示是否在结果中包含相关性信息的布尔值。 您可以使用相关性来获取一个分数,该分数指示查询中的词汇和关键字之间的相关性级别。 此参数默认值为false
。 如果设置为 true,那么还会返回以下字段:total_matching_documents
: 在指定字段中提及术语的集合中的文档数。estimated_matching_results
: 估计在查询返回的文档集中的指定字段中包含术语的文档数。
示例
以下示例返回文档中已识别实体的文本,并指定最多返回 10 个术语。
例如:
term(enriched_text.entities.text,count:10)
当 relevancy
设置为 true
时,结果中将显示相关性分数。 相关性测量频率计数与其他与查询匹配的文档相比的唯一性级别。 如果相关性显示 2.0,那么表示两个数据点相交的次数比预期大 2 倍。
timeslice
一种使用日期创建间隔分段的专用 histogram。
语法
语法是 timeslice({field},{interval},{time_zone})
。
- 您指定的字段必须具有
date
数据类型。 有关日期字段的更多信息,请参阅 如何处理日期。 - 有效时间间隔值为
1second
或{n}seconds
,1minute
或{n}minutes
,1hour
或{n}hours
,1day
或{n}days
,1week
或{n}weeks
,1month
或{n}months
以及1year
或{n}years
,其中 {n} 是数字。 - 您可以选择通过包含
name
参数来包含定制名称。
示例
以下示例显示了每天值的匹配项数。
timeslice(field:DATEA,interval:1day)
结果如下所示。
"aggregations": [
{
"type": "timeslice",
"field": "DATEA",
"interval": "1d",
"results": [
{
"key": 1262304000000,
"key_as_string": "2010-01-01T00:00:00.000Z",
"matching_results": 5
},
{
"key": 1262390400000,
"key_as_string": "2010-01-02T00:00:00.000Z",
"matching_results": 18
},
{
"key": 1262476800000,
"key_as_string": "2010-01-03T00:00:00.000Z",
"matching_results": 38
},
{
"key": 1262563200000,
"key_as_string": "2010-01-04T00:00:00.000Z",
"matching_results": 66
}
top_hits
返回按查询或扩充项分数排名的文档。 可与任何查询参数或聚集配合使用。
语法
{aggregation}.top_hits({n})
示例
以下示例返回每个城市的词汇 halt
的排名靠前的命中。
{
"query":"halt",
"aggregation": "term(CITY).top_hits(1)"
}
响应包含按提及词汇最多的文档中提及的城市分组的词汇 halt
的排名靠前查询结果。 缺省情况下,将返回 10 个结果。 对于 10 个城市中的每个城市,将返回具有最高分数的文档作为 hit
对象。 hits
数组中每个 hit
的内容与 results
数组中每个 result
的内容相匹配。 只有结果的顺序不同。
"aggregations": [
{
"type": "term",
"field": "CITY",
"results": [
{
"key": "LOS ALTOS",
"matching_results": 3,
"aggregations": [
{
"type": "top_hits",
"size": 1,
"hits": {
"matching_results": 3,
"hits": [
{
"document_id": "2bed19a9069442fd82542827ebe260d5_7015",
...
}
]
}
}
]
},
{
"key": "ANDOVER",
"matching_results": 2,
"aggregations": [
{
"type": "top_hits",
"size": 1,
"hits": {
"matching_results": 2,
"hits": [
{
"document_id": "2bed19a9069442fd82542827ebe260d5_18329",
...
}
]
}
}
]
},
...
{
"key":"ACTON",
"maatching_results": 1,
"aggregations": []
}
...
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
趋势
根据关键字值的过去频率变化,检测指定时间段内关键字值频率的剧烈和意外变化。
叙特纳克斯
trend(facet:{aggregation},time_segments:{aggregation})
第一个 (facet
) 聚集必须是下列其中一种聚集类型:
term
group_by
将忽略 term
或 group_by
聚集中的 relevancy
参数。
第二个 (time_segments
) 聚集必须是类型为 timeslice
的聚集。
您也可以包含以下参数:
show_estimated_matching_results:true
: 指示是否在结果中包含estimated_matching_results
信息。 此字段包含估计在指定字段中具有该术语或满足查询返回的文档集内指定时间间隔内指定聚集中的条件的文档数。show_total_matching_documents:true
: 指示是否在结果中包含total_matching_documents
信息。 此字段包含集合中在指定字段中提及术语或满足条件的文档数。
每个查询请求只能使用一个趋势聚集,并且不能将其与任何其他聚集组合。
示例
以下示例通过使用来自以下聚集的结果组合来计算 趋势指示符 或 趋势索引:
- 术语 (风味): 香草,巧克力,薄荷
- timeslice (date,1month): Jan 2020,Feb 2020,Mar 2020,Apr 2020,May 2020,Jun 2020
trend( facet: aggregation(<parameter>...), time_segments: timeslice(<parameter>...)),
show_estimated_matching_results: <true_or_false>, show_total_matching_documents: <true_or_false> )
生成的矩阵可以在表中表示。
2020 年的月份 | 风格: 香草 | 风味: 巧克力 | 类型模板: 薄荷 |
---|---|---|---|
1 月 | 香草 x Jan | 巧克力 x Jan | 铸币局 x Jan |
2 月 | 香草 x 2 月 b | 巧克力 x Feb | 2 月 2 日 |
3 月 | 香草 /Mar,vanilla | 巧克力 x 毛 | 薄荷 x 月 |
4 月 | 香草 /vanilla x Apr | 巧克力 x Apr | 4 月 10 日 |
五月 | 香草 x 5 月 | 巧克力 x 五月 | 薄荷 x 五月 |
6 月 | 香草 /Jun,vanilla | 巧克力 x Jun | 薄荷 x 月 |
在以下样本响应中,关键信息是 trend_indicator
值。 趋势指示符度量给定时间间隔内给定构面值的频率相对于预期平均频率的增加比率。 使用加权算术平均值,根据给定构面值的过去时间间隔频率的变化计算异常平均频率。
如果标准化残差值小于-2,则观测频率小于预期频率。 如果大于 2,那么观察到的频率大于期望的频率。 如果标准化残差大于或小于预期频率 3 或更多,那么会发生异常情况,并表明可能存在值得调查的异常。
例如,5 月份 vanilla
类型模板的预期反馈提交数是根据先前收到的反馈提交数 (从 Jan 到 Apr) 计算的。 结果为 5.341
。 5 月的实际反馈意见数为 10
。 结果表明,香草味得到的反馈数量是预期的两倍左右。 标准化残差值为 2.016
,这大于预期,但并非异常。
{
"aggregations": [
{
"type": "trend",
"facet": "term(flavor),",
"time_segments": "timeslice(date, 1month)",
"show_estimated_matching_results": true,
"show_total_matching_documents": true,
"results": [
{
"aggregations": [
{
"type": "term",
"field": "flavor",
"results": [
{
"key": "vanilla",
"matching_results": 36,
"aggregations": [
{
"type": "timeslice",
"field": "date",
"results": [
{
"key": 1577836800000,
"key_as_string": "2020-01-01T00:00:00.000Z",
"matching_results": 4,
"trend_indicator": 0.0,
"total_matching_documents": 7,
"estimated_matching_results": 0.0
},
{
"key": 1588291200000,
"key_as_string": "2020-05-01T00:00:00.000Z",
"matching_results": 10,
"trend_indicator": 2.016106745,
"total_matching_documents": 12,
"estimated_matching_results": 5.340760209
},
{
"key": 1590969600000,
"key_as_string": "2020-06-01T00:00:00.000Z",
"matching_results": 5,
"trend_indicator": -0.763212711,
"total_matching_documents": 11,
"estimated_matching_results": 7.022515985
}
]
}
]
},
{
"key": "chocolate",
"matching_results": 10,
"aggregations": [...]
},
{
"key": "mint",
"matching_results": 25,
"aggregations": [...]
...
}
主题
检测指定时间段内关键字值的频率偏离预期平均值的程度。 此聚集类型不使用先前时间段的数据。 它通过使用指定时间段内其他关键字值的频率计数平均值来计算索引。
语法
topic(facet:{aggregation},time_segments:{aggregation})
第一个 (facet
) 聚集必须是下列其中一种聚集类型:
term
group_by
将忽略 term
或 group_by
聚集中的 relevancy
参数。
第二个 (time_segments
) 聚集必须是类型为 timeslice
的聚集。
您也可以包含以下参数:
show_estimated_matching_results:true
: 指示是否在结果中包含estimated_matching_results
信息。 此字段包含估计在指定字段中具有该术语或满足查询返回的文档集内指定时间间隔内指定聚集中的条件的文档数。show_total_matching_documents:true
: 指示是否在结果中包含total_matching_documents
信息。 此字段包含集合中在指定字段中提及术语或满足条件的文档数。
每个查询请求只能使用一个主题聚集,并且不能将其与任何其他聚集结合使用。
示例
{
"query: like",
"aggregation": "topic( facet: term(flavor), time_segments: timeslice(date, 1month), show_estimated_matching_results: true, show_total_matching_documents: true )"
}
对于术语聚集示例中使用的相同数据集和聚集,结果可能如下所示。
请注意,topic_indicator
值与 trend
聚集返回的 trend_indicator
值不同。 虽然两者都是根据实际频率和预期频率计算的,但它们有所不同,因为它们的预期频率的计算方式不同。 在 trend
聚集中,5 月份针对香草味冰激凌的反馈提交的预期频率是根据之前针对香草 (从 Jan 到 Apr) 收到的反馈提交数量以及 5 月份针对所有口味收到的反馈提交总数计算得出的。
但是,在 topic
汇总中,5 月份针对香草味冰激凌的反馈提交的预期频率是根据针对香草收到的反馈提交数量和 5 月份针对所有口味收到的反馈提交总数来计算的。 在此示例中,期望的频率结果为 12.169
,实际频率为 10
,topic_indicator
为 -0.621777032
。
{
"aggregations": [
{
"type": "topic",
"facet": "term(flavor)",
"time_segments": "timeslice(date, 1month)",
"show_estimated_matching_results": true,
"show_total_matching_documents": true,
"results": [
{
"aggregations": [
{
"type": "term",
"field": "flavor",
"results": [
{
"key": "vanilla",
"matching_results": 36,
"aggregations": [
{
"type": "timeslice",
"field": "date",
"results": [
{
"key": 1577836800000,
"key_as_string": "2020-01-01T00:00:00.000Z",
"matching_results": 4,
"topic_indicator": -0.027972712,
"total_matching_documents": 7,
"estimated_matching_results": 4.056338028
},
{
"key": 1588291200000,
"key_as_string": "2020-05-01T00:00:00.000Z",
"matching_results": 10,
"topic_indicator": -0.621777032,
"total_matching_documents": 12,
"estimated_matching_results": 12.16901408
},
{
"key": 1590969600000,
"key_as_string": "2020-06-01T00:00:00.000Z",
"matching_results": 5,
"topic_indicator": -0.787665504,
"total_matching_documents": 11,
"estimated_matching_results": 7.098591549
}
]
}
]
},
{
"key": "chocolate",
...
},
{
"key": "mint",
...
}
}
unique_count
返回集合中指定字段的唯一实例计数。
语法
unique_count(field)
示例
以下聚集请求查询中识别的唯一扩充项类型的数目。
unique_count(enriched_text.keyword.type)
结果指示有 17 个匹配结果。 在这 17 个文件中,提到了 14 个实体类型。
{
"matching_results": 17,
"retrieval_details": {
"document_retrieval_strategy": "untrained"
},
"aggregations": [
{
"type": "unique_count",
"field": "enriched_text.entities.type",
"value": 14.0
}
],
"results": []
}
此聚集类型执行终端操作。 与其他聚集组合时,输出不会用作下一个聚集的输入。 输出在离散组中返回。
在以下示例中,聚集参数请求结果以显示前 45 个最常提及的实体。 它指示每个实体提及该术语的文档数以及该术语出现的总次数。
term(enriched_text.entities.text,count:45).unique_count(enriched_text.entities.type)
结果包含多个聚集,例如术语 PostgreSQL
的以下组。 聚集指示该术语出现在 4 文档中,并且被提及 12 次。
{
"key": "PostgreSQL",
"matching_results": 4,
"aggregations": [
{
"type": "unique_count",
"field": "enriched_text.entities.type",
"value": 12.0
}
]
}