elasticsearch elasticsearch仅显示嵌套对象没有值的位置
我有以下结构(简化): 我想找到的是没有供应商状态的记录。我们最近从elasticseach 1.x升级到5.x,我在转换以恢复此功能时遇到了困难 我的旧Nest查询如下所示:elasticsearch elasticsearch仅显示嵌套对象没有值的位置,elasticsearch,nest,elasticsearch,Nest,我有以下结构(简化): 我想找到的是没有供应商状态的记录。我们最近从elasticseach 1.x升级到5.x,我在转换以恢复此功能时遇到了困难 我的旧Nest查询如下所示: !Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First()) .Filter(f2 => f2.Missing(y => y.Id))); 这就产生了: GET purchaseor
!Filter<PurchaseOrder>.Nested(nfd => nfd.Path(x => x.VendorStatuses.First())
.Filter(f2 => f2.Missing(y => y.Id)));
这就产生了:
GET purchaseorder/_search
{
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "vendorStatuses",
}
}
]
}
}
}
但我仍然看到有vendorstatus
记录的结果
我做错了什么?我试着搜索
vendorStatuses.id
或其他字段,但不起作用。当我尝试反转逻辑并执行必须
时,我看不到任何结果。我也试着把它作为一个嵌套的,但没能更进一步。我发现了一个在我看来远远不理想的解决方法。我在我的PurchaseOrder
模型上为NumberOfStatuses
创建了一个新属性,然后我只在该属性上搜索0
的值
public int NumberOfStatuses => VendorStatuses.OrEmptyIfNull().Count();
Query<PurchaseOrder>.Term(t => t.Field(po => po.NumberOfStatuses).Value(0));
public int numberofstatus=>vendorstatus.OrEmptyIfNull().Count();
Term(t=>t.Field(po=>po.numberofstatus).Value(0));
使用的查询必须不
且存在
与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));
您还可以使用使查询更加简洁
var query = !Query<PurchaseOrder>
.Nested(n => n
.Path(p => p.VendorStatuses)
.Query(nq => nq
.Exists(t => t
.Field(f => f.VendorStatuses)
)
)
);
var查询=!查询
.Nested(n=>n
.Path(p=>p.vendorstatus)
.Query(nq=>nq
.存在(t=>t
.字段(f=>f.VendorStatus)
)
)
);
这似乎有效,非常感谢!我试着做Nested
然后bool
,我没有意识到可以做bool
然后Nested
,谢谢!不用担心:)如果您有多个嵌套的查询,您可以使用内部bool
查询执行嵌套的
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"
}
}
]
}
}
}
var query = !Query<PurchaseOrder>
.Nested(n => n
.Path(p => p.VendorStatuses)
.Query(nq => nq
.Exists(t => t
.Field(f => f.VendorStatuses)
)
)
);