2016-10-28 3 views
0

List<VendorStatus> VendorStatuses이고 VendorStatusEstimatedShipDate 인 객체가 있습니다. 구매 주문을 최신 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)))); 

그러나이 중 어느 것도 작동하지 않습니다. 어떻게해야합니까?

탄력성에 맞춰 달리기를 할 때도 날짜 범위를 사용할 수조차 없습니다. 다음 쿼리는 내가 그들에게 "포"

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

우리는 탄성 1.4.5 우리의 프로젝트에 둥지 버전 1.7.2을 사용하고 아래에 나열된 볼 수 있습니다 심지어 head 플러그인을 사용하는 경우 비록 어떤 결과를 반환하지 않습니다.

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