elasticsearch 正在尝试筛选某些可能不存在字段的Elasticsearch结果,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 正在尝试筛选某些可能不存在字段的Elasticsearch结果,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 正在尝试筛选某些可能不存在字段的Elasticsearch结果

elasticsearch 正在尝试筛选某些可能不存在字段的Elasticsearch结果,elasticsearch,nest,elasticsearch,Nest,我有一些数据,我正在尝试添加一个额外的过滤器,它将排除/过滤掉键/值为foo.IsMarried==true的任何结果 现在,有很多文档没有这个字段。如果该字段不存在,那么我假设该值为foo.IsMarried=false。。因此,这些文档将包含在结果集中 有人能提供线索吗 我也在使用.NET“NEST”nuget客户端库-因此,如果答案能够针对这一点,我将非常感激,但对任何答案都很满意,真的。您可以使用带有以下条件的should查询 IsMarried=假 一定不能结婚 我希望您可以将这个原始

我有一些数据,我正在尝试添加一个额外的过滤器,它将排除/过滤掉键/值为
foo.IsMarried==true
的任何结果

现在,有很多文档没有这个字段。如果该字段不存在,那么我假设该值为
foo.IsMarried=false
。。因此,这些文档将包含在结果集中

有人能提供线索吗


我也在使用.NET“NEST”nuget客户端库-因此,如果答案能够针对这一点,我将非常感激,但对任何答案都很满意,真的。

您可以使用带有以下条件的should查询

  • IsMarried=假
  • 一定不能结婚

  • 我希望您可以将这个原始DSL查询转换为NEST

    您可以使用具有以下条件的should查询

  • IsMarried=假
  • 一定不能结婚

  • 我希望您可以将这个原始DSL查询转换为NEST

    通常,在elasticsearch中,对于布尔字段,如果该字段不存在,并不意味着其值为false。这可能是因为它没有价值

    但是,根据您在本例中所做的假设,我们可以检查
    foo.isMarried
    字段是否显式为false
    它在文档本身中不存在。
    拉胡尔在另一个答案中提出的问题起到了作用。但是,由于您需要相同的嵌套版本,因此可以使用下面的代码片段构造查询

    //注意,此处不存在对的使用。如果不想检查“false”值,
    //您可以在此处省略第一个术语过滤器。”T'是要将索引映射到的类型。
    //您应该根据“T”的结构传递字段。
    私有静态QueryContainer buildNoteExistsQuery()
    {
    var boolQuery=new QueryContainerDescriptor().Bool(
    b=>b.应该(
    s=>s.Term(t=>t.Field(f=>f.foo.IsMarried).Value(false)),
    s=>!s.Exists(ne=>ne.Field(f=>f.foo.IsMarried))
    )
    );
    }
    
    您可以通过项目中的
    嵌套
    客户端触发搜索,如下所示

    var result=client.Search(
    .从(0)
    .尺寸(20)
    .Query(q=>buildnotexistquery())
    //您希望链接到此处的其他方法
    )
    
    通常,在elasticsearch中,对于布尔字段,如果该字段不存在,并不意味着其值为false。这可能是因为它没有价值

    但是,根据您在本例中所做的假设,我们可以检查
    foo.isMarried
    字段是否显式为false
    它在文档本身中不存在。
    拉胡尔在另一个答案中提出的问题起到了作用。但是,由于您需要相同的嵌套版本,因此可以使用下面的代码片段构造查询

    //注意,此处不存在对的使用。如果不想检查“false”值,
    //您可以在此处省略第一个术语过滤器。”T'是要将索引映射到的类型。
    //您应该根据“T”的结构传递字段。
    私有静态QueryContainer buildNoteExistsQuery()
    {
    var boolQuery=new QueryContainerDescriptor().Bool(
    b=>b.应该(
    s=>s.Term(t=>t.Field(f=>f.foo.IsMarried).Value(false)),
    s=>!s.Exists(ne=>ne.Field(f=>f.foo.IsMarried))
    )
    );
    }
    
    您可以通过项目中的
    嵌套
    客户端触发搜索,如下所示

    var result=client.Search(
    .从(0)
    .尺寸(20)
    .Query(q=>buildnotexistquery())
    //您希望链接到此处的其他方法
    )
    
    Hi@saigummaluri-感谢您的回答!我现在就要开始尝试了。但问题是——你说过:>“对于一个布尔字段,如果该字段不存在,并不意味着它的值是假的。可能是没有值反对它。”。。这是否意味着我不需要检查字段是否存在?所以我的问题可能更简单?是的,可能更简单。通常,如果字段为空,elasticsearch不会将其添加到反向索引中,因此,您在文档中看不到该字段。在您的例子中,这归结为您如何在数据插入部分处理它。如果您想让它更简单,并且不检查value==false,您可以省略上面代码段中的术语过滤器!我现在就要开始尝试了。但问题是——你说过:>“对于一个布尔字段,如果该字段不存在,并不意味着它的值是假的。可能是没有值反对它。”。。这是否意味着我不需要检查字段是否存在?所以我的问题可能更简单?是的,可能更简单。通常,如果字段为空,elasticsearch不会将其添加到反向索引中,因此,您在文档中看不到该字段。在您的例子中,这归结为您如何在数据插入部分处理它。如果您想让它更简单,而不是检查value==false,您可以省略上面代码段中的术语过滤器。我们可以让它更简单,说“married.ismarried MUST not==true”吗?这样我们就同时包含了false和null。我们能更简单地说“married.ismarried MUST NOT==true”吗?这样我们就包括false和null。
    POST test/person/
    {"name": "p1", "IsMarried": false}
    
    POST test/person/
    {"name": "p2", "IsMarried": true}
    
    POST test/person/
    {"name": "p3"}
    
    Raw DSL query
    
    POST test/person/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "IsMarried": false
              }
            },
            {
              "bool": {
                "must_not": {
                  "exists": {
                    "field": "IsMarried"
                  }
                }
              }
            }
          ]
        }
      }
    }