package main

import (
	"github.com/tidwall/sjson"
	"gopkg.in/olivere/elastic.v5"
)

const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`
const param1 = `{
				"query": {
					"bool": {
						"must": [
						]
					}
				},
				"aggs": {
					"brand_id": {
						"terms": {
							"field": "brand_id",
							"size": 1000
						}
					},
				   "attrs": {
						"nested": {
							"path": "attrs"
						},
						"aggs": {
							"attr_name": {
								"terms": {
									"field": "attrs.attr_name",
									"size": 5000
								},
								"aggs": {
									"attr_value": {
										"terms": {
											"field": "attrs.attr_value",
											"size": 5000
										}
									}
								}
							}
						}
					}
				},
				"sort": {
					"sort": {
						"order": "desc"
					}
				},
				"from": 0,
				"size": 0
		}`


func main() {

	query := elastic.NewBoolQuery()
	query1 := elastic.NewBoolQuery()
	query2 := elastic.NewBoolQuery()

	query1.Must(elastic.NewTermQuery("class_id2",111))
	query1.Should(elastic.NewTermQuery("brand_id","108"))
	query1.Should(elastic.NewTermQuery("brand_id","107"))

	query2.Should(elastic.NewNestedQuery("attrs",elastic.NewBoolQuery().Must(elastic.NewTermQuery("attrs.attr_name","nin"),elastic.NewTermQuery("attrs.attr_value","nni"))))
	query2.Should(elastic.NewNestedQuery("attrs",elastic.NewBoolQuery().Must(elastic.NewTermQuery("attrs.attr_name","3333"),elastic.NewTermQuery("attrs.attr_value","333"))))

	source := elastic.NewSearchSource()
	source.Aggregation("brand_id",elastic.NewTermsAggregation().Field("brand_id").Size(1000))
    source.Aggregation("attrs",elastic.NewNestedAggregation().Path("attrs").
	    	SubAggregation("attr_name",elastic.NewTermsAggregation().Field("attrs.attr_name").Size(5000).
				SubAggregation("attr_value",elastic.NewTermsAggregation().Field("attrs.attr_value").Size(5000))))

	source.FetchSourceContext(elastic.NewFetchSourceContext(true).Include("goods_id", "stock")) //显示字段
	source.Size(1)

	query.Must(query1)
	query.Must(query2)

	source.Query(query)
	searchRequest := elastic.NewSearchRequest().Source(source)
	queryString, _ := searchRequest.Body()
	print(queryString)
	return


	value, _ := sjson.Set(param1, "query.bool.must.-1", map[string]interface{}{"hello":"world"})
	value, _ = sjson.Set(value, "query.bool.must.-1", map[string]interface{}{"hellosss":"world"})
	println(value)
}