在Elasticsearch Nest中用孩子过滤掉行



我有一个可以具有0或许多VendorStatusesPurchaseOrder。我想创建一个过滤器,该过滤器将找到具有 no VendorStatusesPurchaseOrders。我该怎么做?

我尝试过的事情:

Filter &= Filter<PurchaseOrder>.HasChild<PoVendorStatus>(c => c
    .MaxChildren(0)); //40 results
Filter &= Filter<PurchaseOrder>.HasChild<PoVendorStatus>(c => c
    .MaxChildren(0)
    .Query(x => x.MatchAll())); // 0 results
Filter &= Filter<PurchaseOrder>.Missing(y => y.VendorStatuses); // 40 results
Filter &= Filter<PurchaseOrder>.Exists(y => y.VendorStatuses); // 0 results
Filter &= Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First())
    .Filter(f2 => f2.Missing(y => y.Id))); 
//9 results! But these are the ones that *have* statuses, I need the opposite
Filter &= Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First())
    .Filter(f2 => f2.Exists(y => y.Id))); 
//0 results >:(
Filter &= Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses)
    .Query(f2 => f2.Terms(t => t.VendorStatuses.First().Id, new[] { (long?)null })));
//40 results
Filter &= Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses)
    .Query(f2 => f2.Term(t => t.VendorStatuses.First().Id, null)));
//40 results

该索引中有40个记录,我知道至少有一个没有供应商状态的记录,但是这些查询正在返回全部或全无。我该如何实施?

我们使用的是Nest 1.7.2和Elasticsearch版本1.4.5

一个同事找到了一种方法。我们发现,如果我们否定返回所有确实具有状态记录的过滤器,则可以正常工作。我没有意识到您可以简单地否定这样的过滤器。

Filter &= !Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First())
     .Filter(f2 => f2.Missing(y => y.Id))); 

最新更新