【问题标题】:Is there any way to do query aggregation in buckets?有没有办法在桶中进行查询聚合?
【发布时间】:2019-07-03 22:06:35
【问题描述】:

我有一个“PRODUCT_SUPPLIER”索引,其中有一个产品文档及其供应商,字段名称为“product_name”和“product_supplier”。

"mappings" : {
      "properties" : {
        "product_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword"
            }
          }
        },
        "product_supplier" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword"
            }
          }
        }
      }
    }

一种产品可以有多个供应商。我有一个供应商名称说“supplier1”。我得到了这个供应商提供的产品桶。现在,我想从该存储桶中查询以获取存储桶中特定产品的其他供应商名称,但该供应商“supplier1”除外。我的查询是这样的

GET /products_supplier/_search
{
  "query": {
    "term": {
      "product_supplier": {
        "value": "supplier1"
      }
    }
  }, "aggs": {
    "products_list": {
      "terms": {
        "field": "product_name.keyword",
        "size": 10
      }, "aggs": {
        "others_supplier": {
          "terms": {
            "field": "product_supplier.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

我得到以下结果。我不知道如何消除“others_supplier”聚合中的“Supplier1”。

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "products_supplier",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.6931472,
        "_source" : {
          "product_name" : "maggie",
          "product_supplier" : "supplier1"
        }
      },
      {
        "_index" : "products_supplier",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.6931472,
        "_source" : {
          "product_name" : "potatoes",
          "product_supplier" : "supplier1"
        }
      },
      {
        "_index" : "products_supplier",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.6931472,
        "_source" : {
          "product_name" : "chips",
          "product_supplier" : "supplier1"
        }
      }
    ]
  },
  "aggregations" : {
    "products_list" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "chips",
          "doc_count" : 1,
          "others_supplier" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "supplier1",
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "maggie",
          "doc_count" : 1,
          "others_supplier" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "supplier1",
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "potatoes",
          "doc_count" : 1,
          "others_supplier" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "supplier1",
                "doc_count" : 1
              }
            ]
          }
        }
      ]
    }
  }
}

【问题讨论】:

    标签: elasticsearch aggregation


    【解决方案1】:

    您可以在聚合中使用 exclude 设置。例如

    GET /products_supplier/_search
    {
      "query": {
        "term": {
          "product_supplier": {
            "value": "supplier1"
          }
        }
      }, "aggs": {
        "products_list": {
          "terms": {
            "field": "product_name.keyword",
            "size": 10
          }, "aggs": {
            "others_supplier": {
              "terms": {
                "field": "product_supplier.keyword",
                "exclude": "supplier1",
                "size": 10
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 它显示“other_supplier”聚合的存储桶为空。这是输出:"products_list" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "chips", "doc_count" : 1, "others_supplier" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ ] } } }
    • 在您的索引中,您是否至少有一个文档的产品名称为 chips 和其他供应商不是 supplier1
    • 是的,我有。对于筹码,甚至对于玛姬。我有两个与供应商有关的文件:供应商1和供应商2。对于拥有供应商1、供应商2和供应商3的maggie。
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多