elasticsearch Elasticsearch聚合和过滤器,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch Elasticsearch聚合和过滤器,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch Elasticsearch聚合和过滤器

elasticsearch Elasticsearch聚合和过滤器,elasticsearch,kibana,elasticsearch,Kibana,嗨,朋友们,我正试图在我的网站上做一个搜索栏。我有成千上万的公司文章。当我运行此代码时: GET articles/_search { "query": { "bool": { "must": [ { "multi_match": { "query": "assistant", "fields": ["title"] } } ] }

嗨,朋友们,我正试图在我的网站上做一个搜索栏。我有成千上万的公司文章。当我运行此代码时:

GET articles/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "assistant",
            "fields": ["title"]
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "by_company": {
      "terms": {
        "field": "company.keyword",
        "size": 10
      }
    }
  }
}
结果是:

"aggregations": {
"by_company": {
  "doc_count_error_upper_bound": 5,
  "sum_other_doc_count": 409,
  "buckets": [
    {
      "key": "University of Miami",
      "doc_count": 6
    },
    {
      "key": "Brigham & Women's Hospital(BWH)",
      "doc_count": 4
    },
现在我想过滤迈阿密大学的文章,所以我在下面的查询中运行:

GET indeed_psql/job/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "assistant",
            "fields": ["title"]
          }
        }
      ],
      "filter": {
        "term": {
          "company.keyword": "University of Miami"
        }
      }
    }
  },
  "size": 0,
  "aggs": {
    "by_company": {
      "terms": {
        "field": "company.keyword",
        "size": 10
      }
    }
  }
}
但现在的结果是:

"aggregations": {
    "by_company": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "University of Miami",
          "doc_count": 7
        }
      ]
    }

为什么在上一次汇总中只有6个时,突然出现了7个呢???其他大学过滤器也会出现这种情况。我做错了什么?我没有使用标准标记器,从过滤器中我使用英语词干分析器、英语停止词、英语关键字。感谢您的帮助。

您的第一次查询文档计数可能有误。在您的第一个响应中,“doc\u count\u error\u upper\u bound”是5,这意味着返回的聚合中的某些术语在每个底层查询的碎片中都没有作为顶级结果出现。文档计数总是太低而不是太高,因为在查询前N个键的切分过程中可能会“遗漏”文档计数

你有多少碎片?例如,如果有3个碎片,聚合大小为3,文档分布如下:

Shard 1 Shard 2 Shard 3 3 BYU 3 UMiami 3 UMiami 2 UMich 2 BWH 2 UMich 2 MGH 2 UMich 1 BWH 1 UMiami 1 MGH 1 BYU 碎片1碎片2碎片3 3 BYU 3 UMiami 3 UMiami 2 UMich 2 BWH 2 UMich 2 MGH 2 UMich 1 BWH 1台UMiami 1 MGH 1 BYU 每个碎片中的前3个术语合并为:

6 UMiami // returned 6 UMich // returned 3 BWH // returned 3 BYU 2 MGH 6/返回 6/返回 3 BWH//返回 3 BYU 2毫克小时 从中,只返回前三个结果。几乎所有这些密钥都计数不足

您可以看到,在这个场景中,Shard 1中的UMiami文档不会考虑它,因为它超出了3的深度。但是,如果您只查看UMiami,那么您就必须收回每个碎片中的任何相关文档,并最终得到一个准确的计数

您可以使用
shard_size
参数,这样Elasticsearch也可以对每个碎片进行更深入的搜索,以获得更接近的计数。但是考虑到这个方面总共有7个文档,它很可能只出现在您的一个碎片上,因此如果不获取该碎片的所有文档,就很难在顶级聚合中显示它

您可以阅读更多有关计数近似值和错误推导的信息——tldr,Elasticsearch根据每个碎片中的顶部聚合,猜测该方面的文档总数