2014-12-16 20 views
6

Agregatları hesaplamak istediğim bir ürün kataloğum var. Bu, marka adı, üretici, vb. Gibi en üst düzey özellikler için yeterince basittir. Sorun, birden fazla para biriminde sattığımız için fiyatlardaki aralık sayılarını hesaplamaya çalışmakla birlikte gelir ve bu sayıları belirlerken yalnızca bir para biriminde sorgulamak istiyorum zaman. İşteYuvadaki (ElasticSearch) alt/iç içe geçmiş nesnelerdeki toplam değerler

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'ün altındaki bir fiyat ile tüm ürünler için bir sorgusuna bir örnek olduğu: İşte benim ürünü nesnesi haritalama bir örneğidir

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)))); 

bu oluşturduğu ElasticSearch istek:

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

Bu, beklediğiniz gibi, tüm ürünleri 100'ün altında en az bir fiyatla herhangi bir para biriminde döndürür. Yapamadığım şey, bu sorguyu belirli bir para birimindeki fiyatlara karşı çalıştırmaktır. Örneğin, sorguya bu filtre ekleyerek sadece para 1'de bir fiyat yok ürünlerini kaldırır: Ben iç içe geçmiş bir nesne ve bir alt nesne hem de fiyatları listesi tedavi denedim

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)))); 

ama ElasticSearch "AggregationExecutionException [[iç içe] iç içe yol [fiyatlar] iç içe değil)" hatası ve HasChild sorguları için benzer bir hata aldığım için fiyatları bu şekilde dizine ekliyor görünmüyor. Bu şekilde sorguları ve toplamları üretmek mümkün mü?

+0

onay bu yayını [I Elastik Arama için Nükleer Tehlike müşteri ile iç içe türlerini kullanabilirsiniz nasıl Bundan sonra

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

, bu sorguyu yürütmek deneyin ] (http://stackoverflow.com/questions/17834767/how-can-i-use-nested-types-with-nest-client-for-elastic-search). Bu, – octavioccl

+0

yardımcı olabilir. Ne yazık ki bu cevap güncel değil gibi görünüyor. En son yanıtta belirtildiği gibi, NestedObject akıcı yöntemi artık işe yaramıyor ve [ElasticProperty (Type = FieldType.Nested]] özniteliğiyle Prices özelliğini dekore etmeye çalıştım ancak Fiyatlar hala endekslenmiyor iç içe bir nesne. Eşlemeyi alabildiysem, fiyatları iç içe geçmiş bir nesne olarak ele almak, yukarıda anlattığım şekilde toplamları hesaplamama izin veriyor mu? –

cevap

3

Önce iç içe türü eşleştirmek gerekir:

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)))); 
+0

Bu, sorguya baktığım tüm ölçütleri alır, ancak yine de sonuçları herhangi bir para biriminde <100 olan bir fiyatla alıyor. Sanırım burada açıklanan sorunla karşılaşıyorum [link] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-nested-type.html) İlk yanıtınızı düşünüyorum Doğru yoldaydı, fiyatları yuvalanmış tip olarak haritalamam gerekiyor. Bunu söyleyerek yeni bir cevap oluşturun ve işaretleyeceğim. –

İlgili konular