2016-10-28 13 views
0

PurchaseOrderのオブジェクトはList<VendorStatus> VendorStatusesVendorStatusEstimatedShipDateの列を持ちます。注文書を最新のEstimatedShipDateでフィルタリングする必要があります。これどうやってするの?ネストされたオブジェクトの弾性検索フィルタ範囲

私が試してみた:

Filter<PurchaseOrder>.Range(r => r 
    .OnField(x => x.VendorStatuses.OrderByDescending(v => v.StatusUpdateDate).First().EstimatedShipDate) 
    .GreaterOrEquals(fromDate) 
    .LowerOrEquals(toDate)); 

var f = Filter<PurchaseOrder>.Range(r => r 
    .OnField("VendorStatuses.EstimatedShipDate") 
    .GreaterOrEquals(fromDate) 
    .LowerOrEquals(toDate)); 

var newFilter = Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First().EstimatedShipDate)) 
    .Filter(f2 => f2.Range(x => x.OnField(f => f.VendorStatuses.First().EstimatedShipDate) 
    .GreaterOrEquals(fromDate) 
    .LowerOrEquals(toDate)))); 

をしかし、これらのどれも働きました。これどうやってするの?

私は弾性に逆らって走っているときに働く日付範囲を取得することさえできません。次のクエリは、私たちは、弾性1.4.5と我々のプロジェクトにネストバージョン1.7.2を使用している

{ 
    "query": { 
     "range": { 
      "po.vendorStatuses.estimatedShipDate": { 
       "gte": "2016-10-01", 
       "lte": "2016-11-01", 
      } 
     } 
    } 
} 

headプラグインを使用しているとき、私は彼らが「PO」の下にリストされて見ることができるにもかかわらず結果を返しません。

ここに私たちのタイプのいくつかの詳細情報です:巣を使用して

//that builds our search query, contains many methods to build up the FilterContainer 
public class PurchaseOrderSearchQueryBuilder 
{ 
    protected FilterContainer Filter { get; set; } 

    public PurchaseOrderSearchQueryBuilder WithExpectedShipDate(DateTime fromDate, DateTime toDate) 
    { 
     var newFilter = Filter<PurchaseOrder>. 
     //method i need to implment 

     Filter &= newFilter; 

     return this; 
    } 
} 

//example working filter method 
public PurchaseOrderSearchQueryBuilder WithCustomerId(long customerId) 
{ 
    if (customerId > 0) 
     Filter &= Filter && Filter<PurchaseOrder>.Term(p => p.CustomerId, customerId); 
    return this; 
} 

public class PurchaseOrder 
{ 
    ... 
    public long CustomerId { get; set; } 
    public List<PoVendorStatus> VendorStatuses { get; set; } 
} 

public class PoVendorStatus 
{ 
    public long Id { get; set; } 
    ... 
    public DateTime? EstimatedShipDate { get; set; } 
    public DateTime StatusUpdateDate { get; set; } 
} 
+0

あなたは 'ElasticSearch.Net'または' Nest'を使用していますか?両方の名前空間で静的クラス 'Filter <>'を見つけることができません。 – core

+0

NESTのどのバージョンを使用していますか?そして、あなたはElasticsearchのどのバージョンを実行していますか? –

+0

@RussCam Nestバージョン1.7.2 – DLeh

答えて

2

がこの条件を満たしている一つの内側のオブジェクトを持つすべての親オブジェクトを返します。ネストされたオブジェクトを照会する場合は、nestedとしてマップする必要があり、nested queryを使用する必要があります。

//Fluent 
client.Search<PurchaseOrder>(s=>s.Query(
        q=>q.DateRange(
         dr=>dr.Field(p=>p.VendorStatuses.First().StatusUpdateDate) 
           .GreaterThan(fromDate) 
           .LessThan(toDate)))); 
//Object 
client.Search<PurchaseOrder>(new SearchRequest<PurchaseOrder>() 
       { 
        Query =new DateRangeQuery 
        { 
         //If you used all default mappings this might be camelCase 
         Field = "VendorStatuses.StatusUpdateDate", 
         GreaterThan = fromDate, 
         LessThan = toDate 
        } 
       }); 
関連する問題