Get all the buckets for a aggregate elastic search

天大地大妈咪最大 提交于 2021-01-29 09:01:54

问题


I want to get all the buckets available for a particular aggregate. Is there any query or endpoint to get the buckets? Below is my Mapping. If I query with any filter then the related buckets are coming up, but I want all the buckets to show it on the frontend to have or operations. Example: If we have 2 records, one is with category as chair and the other is in the table. If I select a chair it is returning table count is zero but it should show as table count as 1. So user can select both.

MyMapping:

{
"properties": {
  "australiasellable": {
    "type": "boolean"
  },
  "avgRating": {
    "type": "float"
  },
  "categories": {
    "type": "nested"
  },
  "category": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "categorycode": {
    "type": "text",
    "fielddata": true
  },
  "categoryname": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "colour": {
    "type": "text",
    "fielddata": true
  },
  "commercialuse": {
    "type": "boolean"
  },
  "customisable": {
    "type": "boolean"
  },
  "depth": {
    "type": "float"
  },
  "freedelivery": {
    "type": "boolean"
  },
  "height": {
    "type": "float"
  },
  "listprice": {
    "type": "float"
  },
  "location": {
    "type": "geo_point"
  },
  "material": {
    "type": "text",
    "fielddata": true
  },
  "materialcode": {
    "type": "text",
    "fielddata": true
  },
  "message": {
    "type": "geo_point"
  },
  "numberOfRating": {
    "type": "long"
  },
  "online": {
    "type": "boolean"
  },
  "outdooruse": {
    "type": "boolean"
  },
  "productid": {
    "type": "long"
  },
  "productimageurl": {
    "type": "text",
    "fielddata": true
  },
  "productname": {
    "type": "text",
    "fielddata": true
  },
  "producttypecode": {
    "type": "text",
    "fielddata": true
  },
  "sellercode": {
    "type": "text",
    "fielddata": true
  },
  "sellerdescription": {
    "type": "text",
    "fielddata": true
  },
  "shortdescription": {
    "type": "text",
    "fielddata": true
  },
  "sku": {
    "type": "text",
    "fielddata": true
  },
  "state": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "stylecode": {
    "type": "text",
    "fielddata": true
  },
  "warrantycode": {
    "type": "text",
    "fielddata": true
  },
  "weight": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "width": {
    "type": "float"
  }
}

}

Regards, Sreenivas


回答1:


A possible solution would be not to set the filter in the query section of your payload but rather perform filtered aggregations and use the top_hits to get the _sources of the matched docs.

Long story short, if you apply a query, it'll of course affect your aggregations. So the trick is to not apply any query (either match_all or remove the whole query object) and perform the queries in the sub-aggregations as follows:

Using your category field:

GET your_index/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "actual_query_agg": {
      "filter": {
        "term": {
          "category.keyword": {
            "value": "chair"
          }
        }
      },
      "aggs": {
        "actual_query_agg_top_hits": {
          "top_hits": {
            "_source": [
              "category"
            ],
            "size": 10
          }
        }
      }
    },
    "excluding_my_query_filtered_agg": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "category.keyword": "chair"
            }
          }
        }
      },
      "aggs": {
        "by_other_categories_agg": {
          "terms": {
            "field": "category.keyword",
            "size": 10
          },
          "aggs": {
            "categorized_other_docs_agg_top_hits": {
              "top_hits": {
                "_source": [
                  "category"
                ],
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

You can get rid of the top_hits sub-aggregations if you're just interested in the counts and not the underlying docs, i.e.:

GET your_index/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "actual_query_agg": {
      "filter": {
        "term": {
          "category.keyword": {
            "value": "chair"
          }
        }
      }
    },
    "excluding_my_query_filtered_agg": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "category.keyword": "chair"
            }
          }
        }
      },
      "aggs": {
        "by_other_categories_agg": {
          "terms": {
            "field": "category.keyword",
            "size": 10
          }
        }
      }
    }
  }
}


来源:https://stackoverflow.com/questions/59987852/get-all-the-buckets-for-a-aggregate-elastic-search

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!