2017-08-21 45 views
0

我有以下結構(簡化):elasticsearch只顯示其中嵌套的對象沒有價值

{ 
    "id": 100, 
    "vendorStatuses": [ 
     { 
      "id": 200, 
      "status": "Open" 
     } 
    ] 
} 

我想找到什麼是那裏有沒有供應商的狀態記錄。我們最近從elasticseach 1.x升級到5.x,並且無法轉換爲獲取此功能。

我的舊巢查詢是這樣的:

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

新的查詢(現在Missing不可用)看起來像這樣至今:

Query<PurchaseOrder> 
    .Bool(z => z 
     .MustNot(a => a 
      .Exists(t => t 
       .Field(f => f.VendorStatuses) 
      ) 
     ) 
    ); 

產生這樣的:

GET purchaseorder/_search 
{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "exists": { 
      "field": "vendorStatuses", 
      } 
     } 
     ] 
    } 
    } 
} 

但我仍然看到有vendorStatuses記錄的結果。

我在做什麼錯?我嘗試過搜索vendorStatuses.id或其他字段,但它不起作用。當我嘗試反轉邏輯並執行must時,我看不到任何結果。我也試過把它作爲nested來做,但是不能接近。

回答

1

使用must_notexists該查詢不是nested查詢像1.x的查詢。我認爲你正在尋找的東西像

var query = Query<PurchaseOrder> 
    .Bool(z => z 
     .MustNot(a => a 
      .Nested(n => n 
       .Path(p => p.VendorStatuses) 
       .Query(nq => nq 
        .Exists(t => t 
         .Field(f => f.VendorStatuses) 
        ) 
       ) 
      ) 
     ) 
    ); 

client.Search<PurchaseOrder>(s => s.Query(_ => query)); 

這將產生

{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "nested": { 
      "query": { 
       "exists": { 
       "field": "vendorStatuses" 
       } 
      }, 
      "path": "vendorStatuses" 
      } 
     } 
     ] 
    } 
    } 
} 

您可以使用operator overloading,使查詢更加簡潔太

var query = !Query<PurchaseOrder> 
    .Nested(n => n 
     .Path(p => p.VendorStatuses) 
     .Query(nq => nq 
      .Exists(t => t 
       .Field(f => f.VendorStatuses) 
      ) 
     ) 
    ); 
+0

,似乎工作,非常感謝你許多!我試圖做'嵌套',然後'布爾',我沒有意識到可以做'布爾'然後'嵌套',謝謝! – DLeh

+0

不用擔心:)如果您有多個'嵌套'查詢,您可以使用內部'bool'查詢來執行'nested' –

0

我發現在我看來一個遠非理想的解決方法。我在PurchaseOrder模型上爲NumberOfStatuses創建了一個新的屬性,然後我只對該值進行術語搜索,得到0的值。

public int NumberOfStatuses => VendorStatuses.OrEmptyIfNull().Count(); 

Query<PurchaseOrder>.Term(t => t.Field(po => po.NumberOfStatuses).Value(0)); 
相關問題