Есть ли способ сделать агрегирование запросов в сегментах? - PullRequest
1 голос
/ 03 июля 2019

У меня есть индекс «PRODUCT_SUPPLIER», в котором у меня есть документы продуктов с поставщиками, имеющие поля с именами «product_name» и «product_supplier».

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

Продукт может иметь более одного поставщика. У меня есть имя поставщика сказать «поставщик1». Я получаю ведра продуктов, поставляемых этим поставщиком. Теперь из этих ячеек я хочу сделать запрос, чтобы получить имена других поставщиков конкретных продуктов в ведрах, кроме этого поставщика "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
          }
        }
      }
    }
  }
}

Я получаю следующие результаты. Я не знаю, как исключить «Supplier1» в агрегации «others_supplier».

{
  "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
              }
            ]
          }
        }
      ]
    }
  }
}

1 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать параметр 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
          }
        }
      }
    }
  }
}
...