c# - 嵌套对象上的Elasticsearch过滤器范围

标签 c# .net elasticsearch nest

我有一个对象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))));

但是这些都不起作用。我怎样才能做到这一点?

直接针对 flex 运动时,我什至无法使日期范围正常工作。即使使用head插件,以下查询也不会返回任何结果,尽管我可以在“po”下看到它们
{
    "query": {
        "range": {
            "po.vendorStatuses.estimatedShipDate": {
                "gte": "2016-10-01",
                "lte": "2016-11-01",
            }
        }
    }
}

我们在 flex 为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这将返回所有具有一个满足条件的内部对象的父对象。如果还要查询嵌套对象,则需要将其映射为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
                    }
                });

关于c# - 嵌套对象上的Elasticsearch过滤器范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311027/

相关文章:

c# - 如何导出VS2010命令行构建/编译参数

c# - 如何在 C# 中比较 char[]array 以了解病房是否为回文

c# - Application.Restart 不好吗?

c# - 将 XML 写入文件而不覆盖以前的数据

c# - 如何在列表相同的 Dictionary<string, List<int>> 中按 List<int> 分组?

elasticsearch - span term query 和 term query 有什么区别?

javascript - SignalR 不会触发客户端回调

c# - 如何部分退款使用 Invoicing SDK 创建的 paypal 发票

ruby - 如何从 ElasticSearch 结果集中排除带有 ids 的数组?

windows - Kibana 无法连接到 docker 上的 Elasticsearch