elasticsearch elasticsearch仅显示嵌套对象没有值的位置,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch elasticsearch仅显示嵌套对象没有值的位置,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch elasticsearch仅显示嵌套对象没有值的位置

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

我有以下结构(简化):

我想找到的是没有供应商状态的记录。我们最近从elasticseach 1.x升级到5.x,我在转换以恢复此功能时遇到了困难

我的旧Nest查询如下所示:

!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)
            )
        )
    );