1

Articles と VariationGroups の間の OneToMany 関係を考えてみましょう。

ElasticSearch では、各記事ドキュメントに「variationGroup」フィールドがあります。

用語集計を使用して、記事ドキュメントのフィールド「variationGroup」で結果をグループ化します。
TopHits サブ集計を使用して、各バケットの最初のドキュメントを取得します。

各バリエーション グループの最低価格を取得するにはどうすればよいですか? 用語集計で最小サブ集計を使用すると、クエリに一致するドキュメントで最小価格が計算されます。

バリエーション グループにグループ化できるすべてのドキュメントの最低価格を取得したいと考えています。

たとえば、「Tshirt with stars」という名前の VariationGroup には 6 つの記事が含まれています。クエリ "red Tshirt" は、6 つの記事のうち 2 つを返します。
クエリに一致する 2 つの記事だけでなく、6 つの記事の最低価格を取得したいと考えています。

それは同じ呼び出しでも可能ですか?

対応する json は次のとおりです。

{
  "query": {
    "match": {
      "name": "red Tshirt"
    }
  },
  "size": 0,
  "aggs": {
    "variation_groups": {
      "terms": {
        "field": "variationGroup",
        "size": 0
      },
      "aggs": {
        "min_price": {
          "min": {
            "field": "price"
          }
        },
        "max_price": {
          "max": {
            "field": "price"
          }
        },
        "top_article": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }
}
4

1 に答える 1

3

はい、これは集計が一致したドキュメントのみに適用されるためです。通常のクエリの代わりに使用したい場合post_filterは、集計がすべてのドキュメントで実行され、最後にred Tshirtドキュメントのみが返されます。

{
  "aggs": {
    "variation_groups": {
      "terms": {
        "field": "variationGroup",
        "size": 0
      },
      "aggs": {
        "min_price": {
          "min": {
            "field": "price"
          }
        },
        "max_price": {
          "max": {
            "field": "price"
          }
        },
        "top_article": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  },
  "post_filter": {               <---- move your query in a post_filter
      "query": {
         "match": {
            "name": "red Tshirt"
         }
      }
  }   
}

アップデート

あなたのコメントに基づいて、私は次のようにします:

{
  "size": 0,
  "aggs": {
    "variation_groups": {
      "terms": {
        "field": "variationGroup",
        "size": 0
      },
      "aggs": {
        "min_price": {
          "min": {
            "field": "price"
          }
        },
        "max_price": {
          "max": {
            "field": "price"
          }
        },
        "top_article": {
          "filter": {
            "query": {
              "match": {
                "name": "red Tshirt"
              }
            }
          },
          "aggs": {
            "top_article": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}
于 2015-11-13T12:29:56.360 に答える