在之前的示例中,学习了如何根据单个字段的重要性调整评分。function_score
查询允许定义一个完整的函数,可以混合字段值、TF/IDF
评分、像Gaussian、exponential和linear
这样的衰减函数,甚至还可以使用Painless脚本语言编写脚本。可以使用`missing关键字指定在源文档中没有该字段值的情况下的默认值。
在下面的查询中,如果字段rating
在源文档中不存在,则该文档的评分将乘以0,从而将其移到结果集的底部。该查询还通过使用sort
关键字以ascending顺序对结果进行排序来反转结果集。
_sort
参数是一种灵活的排序方式。可以对字母和数字字段进行排序,也可以按评分进行排序。
POST my-movie-index/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "horror",
"fields": [
"title"
]
}
},
"functions": [
{
"field_value_factor": {
"field": "rating",
"missing": 0
}
}
]
}
},
"sort": [
{
"_score": {
"order": "asc"
}
}
]
}
请注意结果集中缺少rating
字段,这就是 _score
值设置为 0 的原因。
聚合计算基于特定字段中值的分组而得出的汇总值。 有许多类型的聚合可以在查询中使用。
OpenSearch 的许多类型的聚合提供了其分析功能。可以基于时间、关键字字段的字符串值和数字进行分桶。数字聚合支持最小值、最大值、平均值、总和等组合函数。管道聚合将聚合的输出流向其他聚合。
聚合是嵌套的。日志分析中最常见的聚合是按时间进行分桶,并在每个桶中计算其他聚合,如总和。这样,可以在时间点上汇总 CPU 百分比等字段的值。
聚合是发送到 OpenSearch 的 JSON 查询的一部分。OpenSearch 在查询响应的单独部分返回聚合结果。不需要获取搜索结果就可以获取聚合结果。
在下面的查询中,OpenSearch 对 genres.keyword
字段进行聚合。通过使用 “size”: 0 指令,OpenSearch 将省略实际文档,只返回聚合结果。
GET my-movie-index/_search
{
"aggs": {
"term_agg": {
"terms": {
"field": "genres.keyword"
}
}
},
"size": 0
}
聚合也可以嵌套。运行下面的查询并查看结果。
GET my-movie-index/_search
{
"aggs": {
"year": {
"aggs": {
"genre": {
"terms": {
"field": "genres.keyword",
"order": {
"_key": "asc"
}
}
}
},
"terms": {
"field": "year"
}
}
},
"size": 0
}
首先,OpenSearch 按year对结果进行分桶。接下来,在每个桶内,它按genres.keyword
进行分桶。