2016-12-12 5 views
2

私はPurchaseOrderの型を持っていますが、これは0または多くのVendorStatusesを持つことができます。 PurchaseOrdersのフィルタを作成して、VendorStatusesとしたいとします。これどうやってするの?Elasticsearch Nestで子を含む行をフィルタリングする

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件の記録があり、そして私は、ベンダーのステータスを持っていない少なくとも一つがあります知っているが、これらのクエリは、すべて、または何も戻ってきている。

物事は私が試してみました。これをどのように実装できますか?

我々はこれを行う方法を見つけた巣1.7.2とElasticsearchバージョン1.4.5

答えて

0

同僚を使用しています。ステータスを持つすべてのレコードを返すフィルタを無効にすると、正常に機能することがわかりました。私は、あなたがそのようなフィルタを単に否定することができるとは気付かなかった。

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

NESTは '&' 'オーバーロード|接続詞、選言とクエリと容易にフィルタの否定を作るために' FilterContainer'と 'QueryContainer'上の'と ''演算子を!。 2.xでは、 '+'単項演算子もオーバーロードされ、 'bool'クエリ' filter'節にクエリーをラップします。 –

+0

私は彼らが '&'と '|'をオーバーロードしているのを知っていましたが、 '!'が上書きされているのを見ることができませんでした。 – DLeh

関連する問題