6

集計を計算したい製品のカタログがあります。これは、ブランド名、メーカーなどのトップレベルのプロパティには十分に単純です。問題は、複数の通貨で販売しているため、価格の範囲カウントを計算しようとすると発生します。時間。これが私の製品オブジェクト マッピングのサンプルです。

public class Product
{
    public int ID { get; set;}
    public string Name { get; set; }
    public IList<Price> Prices { get; set; }
}

public class Price
{
    public int CurrencyID { get; set; }
    public decimal Cost { get; set; }
}

価格が 100 未満のすべての製品に対するクエリの例を次に示します。

var cheapProducts = client.Search<Product>(s => s
    .From(0)
    .Size(1000)
    .Query(q => q
        .Range(r => r
            .LowerOrEquals(100)
            .OnField(f => f.Prices.FirstOrDefault().Cost))));

これが生成する ElasticSearch リクエストは次のとおりです。

{
    "from": 0,
    "size": 1000,
    "query": {
        "range" : {
            "prices.cost": {
                "lte": "100"
            }
        }
    }
}

これにより、予想どおり、任意の通貨で少なくとも 1 つの価格が 100 未満のすべての製品が返されます。私ができなかったことは、特定の通貨の価格だけに対してこのクエリを実行することです。たとえば、次のフィルターをクエリに追加すると、価格が通貨 1 でない商品のみが削除されます。

var cheapProducts = client.Search<Product>(s => s
    .From(0)
    .Size(1000)
    .Filter(f => f
        .Term(t => t
            .Prices.FirstOrDefault().CurrencyID, 1))
    .Query(q => q
        .Range(r => r
            .LowerOrEquals(100)
            .OnField(f => f.Prices.FirstOrDefault().Cost))));

価格リストをネストされたオブジェクトと子オブジェクトの両方として扱ってみましたが、"AggregationExecutionException[[nested] nested path [prices] is入れ子にされていない]" など、HasChild クエリについても同様です。この方法でクエリと集計を生成することは可能ですか?

4

1 に答える 1

3

最初に、ネストされた型をマップする必要があります。

 public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
   [ElasticProperty(Type = FieldType.Nested)]
    public IList<Price> Prices { get; set; }
}

その後、次のクエリを実行してみてください。

 var cheapProducts = client.Search<Product>(s => s
            .From(0)
            .Size(1000)
            .Query(x => x.Term(p => p
                .Prices.First().CurrencyID, 1) && x.Range(r => r
                    .LowerOrEquals(100)
                    .OnField(f => f.Prices.FirstOrDefault().Cost))));
于 2014-12-16T20:42:26.430 に答える