簡體   English   中英

嵌套對象上的Elasticsearch過濾器范圍

[英]Elasticsearch filter range on nested objects

我有一個對象PurchaseOrder ,它具有List<VendorStatus> VendorStatusesVendorStatus有一個EstimatedShipDate列。 我需要按最新的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))));

但是這些都不起作用。 我怎樣才能做到這一點?

直接針對彈性運動時,我什至無法使日期范圍正常工作。 即使使用head插件,以下查詢也不會返回任何結果,盡管我可以在“ po”下看到它們

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

我們在彈性為1.4.5的項目中使用Nest版本1.7.2。

以下是有關我們的類型的更多信息:

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

使用nest這將返回所有具有一個滿足條件的內部對象的父對象。 如果您想查詢嵌套對象也需要被映射為嵌套 ,你需要使用嵌套查詢

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM