采样器聚合编辑

一种过滤聚合,用于将任何子聚合的处理限制为得分最高的文档样本。

用例示例

  • 将分析的重点缩小到高度相关的匹配项,而不是可能非常长的低质量匹配项
  • 降低可以仅使用样本产生有用结果的聚合的运行成本,例如 significant_terms

示例

在 StackOverflow 数据中对热门术语 javascript 或较罕见的术语 kibana 进行查询将匹配许多文档 - 其中大多数文档缺少单词 Kibana。为了将 significant_terms 聚合的重点放在更有可能匹配查询中最有趣部分的得分最高的文档上,我们使用了一个样本。

response = client.search(
  index: 'stackoverflow',
  size: 0,
  body: {
    query: {
      query_string: {
        query: 'tags:kibana OR tags:javascript'
      }
    },
    aggregations: {
      sample: {
        sampler: {
          shard_size: 200
        },
        aggregations: {
          keywords: {
            significant_terms: {
              field: 'tags',
              exclude: [
                'kibana',
                'javascript'
              ]
            }
          }
        }
      }
    }
  }
)
puts response
POST /stackoverflow/_search?size=0
{
  "query": {
    "query_string": {
      "query": "tags:kibana OR tags:javascript"
    }
  },
  "aggs": {
    "sample": {
      "sampler": {
        "shard_size": 200
      },
      "aggs": {
        "keywords": {
          "significant_terms": {
            "field": "tags",
            "exclude": [ "kibana", "javascript" ]
          }
        }
      }
    }
  }
}

响应

{
  ...
  "aggregations": {
    "sample": {
      "doc_count": 200, 
      "keywords": {
        "doc_count": 200,
        "bg_count": 650,
        "buckets": [
          {
            "key": "elasticsearch",
            "doc_count": 150,
            "score": 1.078125,
            "bg_count": 200
          },
          {
            "key": "logstash",
            "doc_count": 50,
            "score": 0.5625,
            "bg_count": 50
          }
        ]
      }
    }
  }
}

总共采样了 200 个文档。因此,执行嵌套 significant_terms 聚合的成本是有限的,而不是无限制的。

如果没有 sampler 聚合,则请求查询会考虑低质量匹配项的完整“长尾”,因此会识别不太重要的术语,例如 jqueryangular,而不是关注更有洞察力的 Kibana 相关术语。

response = client.search(
  index: 'stackoverflow',
  size: 0,
  body: {
    query: {
      query_string: {
        query: 'tags:kibana OR tags:javascript'
      }
    },
    aggregations: {
      low_quality_keywords: {
        significant_terms: {
          field: 'tags',
          size: 3,
          exclude: [
            'kibana',
            'javascript'
          ]
        }
      }
    }
  }
)
puts response
POST /stackoverflow/_search?size=0
{
  "query": {
    "query_string": {
      "query": "tags:kibana OR tags:javascript"
    }
  },
  "aggs": {
    "low_quality_keywords": {
      "significant_terms": {
        "field": "tags",
        "size": 3,
        "exclude": [ "kibana", "javascript" ]
      }
    }
  }
}

响应

{
  ...
  "aggregations": {
    "low_quality_keywords": {
      "doc_count": 600,
      "bg_count": 650,
      "buckets": [
        {
          "key": "angular",
          "doc_count": 200,
          "score": 0.02777,
          "bg_count": 200
        },
        {
          "key": "jquery",
          "doc_count": 200,
          "score": 0.02777,
          "bg_count": 200
        },
        {
          "key": "logstash",
          "doc_count": 50,
          "score": 0.0069,
          "bg_count": 50
        }
      ]
    }
  }
}

shard_size编辑

shard_size 参数限制在每个分片上处理的样本中收集多少个得分最高的文档。默认值为 100。

限制编辑

不能嵌套在 breadth_first 聚合下编辑

作为基于质量的过滤器,采样器聚合需要访问为每个文档生成的相关性得分。因此,它不能嵌套在 terms 聚合下,该聚合已将 collect_mode 从默认的 depth_first 模式切换为 breadth_first,因为这会丢弃分数。在这种情况下,将抛出错误。