Elasticsearch 聚合(脚本化指标聚合)

Elasticsearch Aggregation (scripted metric aggregation)

我有包含类别数组的产品集合。 我需要的是聚合 (?) - 一组不同的 category_id。 也很高兴 - 每个 category_id.

的匹配产品编号计数

样本索引数据

{
  "data": [
    {
      "took": 6,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 4257,
        "max_score": 1.0,
        "hits": [
          {
            "_index": "index_name",
            "_type": "product",
            "_id": "4",
            "_score": 1.0,
            "_source": {
              "entity_id": "4",
              "attribute_set_id": "4",
              "type_id": "simple",
              "sku": "skuxxx",
              "has_options": false,
              "required_options": false,
              "created_at": "2020-01-29 06:38:52",
              "updated_at": "2020-09-04 12:31:00",
              "visibility": "4"
            },
            "category": [
              {
                "category_id": 2,
                "is_virtual": "false"
              },
              {
                "category_id": 3,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name1"
              },
              {
                "category_id": 4,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name2"
              },
              {
                "category_id": 7,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name3"
              }
            ]
          }
        ]
      }
    }
  ]
}

我需要的是类别 ID 数组,按产品数量和过滤类别的可能性排序("is_virtual""is_parent"):

预期结果

{
  "data": [
    {
      "categories": [
        {
          "category_id": 2,
          "doc_count": 555
        },
        {
          "category_id": 3,
          "doc_count": 150
        },
        {
          "category_id": 56,
          "doc_count": 12
        }
      ]
    }
  ]
}

索引映射

{
"index": {
    "mappings": {
        "product": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "EAN01": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN02": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN03": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN04": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN05": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN06": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN07": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN08": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN09": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN10": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN11": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN12": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN13": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN14": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN15": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN16": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN17": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN18": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN19": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "EAN20": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "activity": {
                    "type": "integer"
                },
                "attribute_set1_1": {
                    "type": "integer"
                },
                "attribute_set_id": {
                    "type": "integer"
                },
                "attributeset2attribute1": {
                    "type": "integer"
                },
                "attributeset3attribute1": {
                    "type": "integer"
                },
                "autocomplete": {
                    "type": "text",
                    "fields": {
                        "shingle": {
                            "type": "text",
                            "analyzer": "shingle"
                        },
                        "whitespace": {
                            "type": "text",
                            "analyzer": "whitespace"
                        }
                    },
                    "analyzer": "standard"
                },
                "belongs_to_catalog": {
                    "type": "boolean"
                },
                "ca_1_1243545189": {
                    "type": "integer"
                },
                "category": {
                    "type": "nested",
                    "properties": {
                        "category_id": {
                            "type": "integer"
                        },
                        "is_blacklisted": {
                            "type": "boolean"
                        },
                        "is_parent": {
                            "type": "boolean"
                        },
                        "is_virtual": {
                            "type": "boolean"
                        },
                        "name": {
                            "type": "text",
                            "copy_to": [
                                "search",
                                "spelling"
                            ],
                            "analyzer": "standard"
                        },
                        "position": {
                            "type": "integer"
                        }
                    }
                },
                "category_gear": {
                    "type": "integer"
                },
                "children_attributes": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "children_ids": {
                    "type": "integer"
                },
                "color": {
                    "type": "integer"
                },
                "configurable_attributes": {
                    "type": "keyword"
                },
                "configurable_variation": {
                    "type": "integer"
                },
                "created_at": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
                },
                "custom_price": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "description": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "eco_collection": {
                    "type": "boolean"
                },
                "entity_id": {
                    "type": "integer"
                },
                "erin_recommends": {
                    "type": "boolean"
                },
                "features_bags": {
                    "type": "integer"
                },
                "gender": {
                    "type": "integer"
                },
                "has_options": {
                    "type": "boolean"
                },
                "image": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "indexed_attributes": {
                    "type": "keyword"
                },
                "manufacturer": {
                    "type": "integer"
                },
                "material": {
                    "type": "integer"
                },
                "mycolor": {
                    "type": "integer"
                },
                "mysize": {
                    "type": "integer"
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "shingle": {
                            "type": "text",
                            "analyzer": "shingle"
                        },
                        "sortable": {
                            "type": "text",
                            "analyzer": "sortable",
                            "fielddata": true
                        },
                        "whitespace": {
                            "type": "text",
                            "analyzer": "whitespace"
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "new": {
                    "type": "boolean"
                },
                "option_text_activity": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_attribute_set1_1": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_attributeset2attribute1": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_attributeset3attribute1": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_belongs_to_catalog": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_ca_1_1243545189": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_category_gear": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_color": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_configurable_variation": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_eco_collection": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_erin_recommends": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_features_bags": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_gender": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_manufacturer": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_material": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_mycolor": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_mysize": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_new": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_performance_fabric": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_sale": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_size": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_status": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "option_text_strap_bags": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_style_bags": {
                    "type": "keyword",
                    "ignore_above": 256
                },
                "option_text_tax_class_id": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "performance_fabric": {
                    "type": "boolean"
                },
                "price": {
                    "type": "nested",
                    "properties": {
                        "customer_group_id": {
                            "type": "integer"
                        },
                        "final_price": {
                            "type": "double"
                        },
                        "is_discount": {
                            "type": "boolean"
                        },
                        "max_price": {
                            "type": "double"
                        },
                        "min_price": {
                            "type": "double"
                        },
                        "original_price": {
                            "type": "double"
                        },
                        "price": {
                            "type": "double"
                        },
                        "tax_class_id": {
                            "type": "integer"
                        }
                    }
                },
                "required_options": {
                    "type": "boolean"
                },
                "sale": {
                    "type": "boolean"
                },
                "search": {
                    "type": "text",
                    "fields": {
                        "shingle": {
                            "type": "text",
                            "analyzer": "shingle"
                        },
                        "whitespace": {
                            "type": "text",
                            "analyzer": "whitespace"
                        }
                    },
                    "analyzer": "standard"
                },
                "search_query": {
                    "type": "nested",
                    "properties": {
                        "is_blacklisted": {
                            "type": "boolean"
                        },
                        "position": {
                            "type": "integer"
                        },
                        "query_id": {
                            "type": "integer"
                        }
                    }
                },
                "short_description": {
                    "type": "text",
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "size": {
                    "type": "integer"
                },
                "sku": {
                    "type": "text",
                    "fields": {
                        "shingle": {
                            "type": "text",
                            "analyzer": "shingle"
                        },
                        "sortable": {
                            "type": "text",
                            "analyzer": "sortable",
                            "fielddata": true
                        },
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        },
                        "whitespace": {
                            "type": "text",
                            "analyzer": "whitespace"
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "reference"
                },
                "spelling": {
                    "type": "text",
                    "fields": {
                        "phonetic": {
                            "type": "text",
                            "analyzer": "phonetic"
                        },
                        "shingle": {
                            "type": "text",
                            "analyzer": "shingle"
                        },
                        "whitespace": {
                            "type": "text",
                            "analyzer": "whitespace"
                        }
                    },
                    "analyzer": "standard"
                },
                "status": {
                    "type": "integer"
                },
                "stock": {
                    "properties": {
                        "is_in_stock": {
                            "type": "boolean"
                        },
                        "qty": {
                            "type": "integer"
                        }
                    }
                },
                "strap_bags": {
                    "type": "integer"
                },
                "style_bags": {
                    "type": "integer"
                },
                "tax_class_id": {
                    "type": "integer"
                },
                "type_id": {
                    "type": "keyword"
                },
                "updated_at": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
                },
                "url_key": {
                    "type": "text",
                    "fields": {
                        "untouched": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "copy_to": [
                        "search",
                        "spelling"
                    ],
                    "analyzer": "standard"
                },
                "visibility": {
                    "type": "integer"
                }
            }
        }
    }
}

}

添加包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "category": {
        "type": "nested"
      }
    }
  }
}

索引数据:

{
  "entity_id": "4",
  "attribute_set_id": "4",
  "type_id": "simple",
  "sku": "skuxxx",
  "has_options": false,
  "required_options": false,
  "created_at": "2020-01-29 06:38:52",
  "updated_at": "2020-09-04 12:31:00",
  "visibility": "4",
  "category": [
              {
                "category_id": 2,
                "is_virtual": "false"
              },
              {
                "category_id": 3,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name3"
              }
            ]
}

{
  "entity_id": "4",
  "attribute_set_id": "4",
  "type_id": "simple",
  "sku": "skuxxx",
  "has_options": false,
  "required_options": false,
  "created_at": "2020-01-29 06:38:52",
  "updated_at": "2020-09-04 12:31:00",
  "visibility": "4",
  "category": [
              {
                "category_id": 2,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name1"
              }
            ]
}

{
  "entity_id": "4",
  "attribute_set_id": "4",
  "type_id": "simple",
  "sku": "skuxxx",
  "has_options": false,
  "required_options": false,
  "created_at": "2020-01-29 06:38:52",
  "updated_at": "2020-09-04 12:31:00",
  "visibility": "4",
  "category": [
              {
                "category_id": 2,
                "is_virtual": "false"
              },
              {
                "category_id": 3,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name1"
              },
              {
                "category_id": 4,
                "is_parent": true,
                "is_virtual": "false",
                "name": "Category name2"
              }
            ]
}

搜索查询:

{
  "size": 0,
  "aggs": {
    "nested_path": {
      "nested": {
        "path": "category"
      },
      "aggs": {
        "distinct_categories": {
          "terms": {
            "field": "category.category_id"
          },
          "aggs": {
            "top_category_hits": {
              "top_hits": {
               "_source": {
                  "includes": [
                    "category.category_id"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}

搜索结果:

"aggregations": {
    "nested_path": {
      "doc_count": 6,
      "distinct_categories": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 2,
            "doc_count": 3,                <-- note this 
            "top_category_hits": {
              "hits": {
                "total": {
                  "value": 3,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "category",
                      "offset": 0
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 2
                    }
                  },
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "3",
                    "_nested": {
                      "field": "category",
                      "offset": 0
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 2
                    }
                  },
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "2",
                    "_nested": {
                      "field": "category",
                      "offset": 0
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 2            <-- note this 
                    }
                  }
                ]
              }
            }
          },
          {
            "key": 3, 
            "doc_count": 2,                <-- note this 
            "top_category_hits": {
              "hits": {
                "total": {
                  "value": 2,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "category",
                      "offset": 1
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 3
                    }
                  },
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "2",
                    "_nested": {
                      "field": "category",
                      "offset": 1
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 3             <-- note this 
                    }
                  }
                ]
              }
            }
          },
          {
            "key": 4,
            "doc_count": 1,                <-- note this                
            "top_category_hits": {
              "hits": {
                "total": {
                  "value": 1,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "stof_64259310",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "category",
                      "offset": 2
                    },
                    "_score": 1.0,
                    "_source": {
                      "category_id": 4       <-- note this
                    }
                  }
                ]
              }
            }
          }
        ]
      }