查询数据IV

Function Score Query

在之前的示例中,学习了如何根据单个字段的重要性调整评分。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"
      }
    }
  ]
}

img

请注意结果集中缺少rating字段,这就是 _score 值设置为 0 的原因。

聚合查询 - Aggregation Query

  • 聚合计算基于特定字段中值的分组而得出的汇总值。 有许多类型的聚合可以在查询中使用。

  • 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进行分桶。