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

uidvcgyl  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(492)

我有一些数据,我正在尝试添加一个额外的过滤器,它将排除/过滤掉任何键/值所在的结果 foo.IsMarried == true .
现在,有很多文档没有这个字段。如果字段不存在,那么我假设值为 foo.IsMarried = false .. 因此这些文档将包含在结果集中。
有人能提供线索吗?
我也在使用.net的“nest”nuget客户端库-所以如果答案能针对这个问题,我会非常感激,但对任何答案都很满意,真的。

jexiocij

jexiocij1#

通常,在elasticsearch中,对于布尔字段,如果该字段不存在,并不意味着其值为false。这可能是没有价值的反对。
但是,根据你在本案中的假设-我们可以检查 foo.isMarried 显式为false OR 它不存在于文档本身中。拉胡尔在另一个答案中提出的问题起到了作用。但是既然你想要一个 NEST 在相同的版本中,可以使用下面的代码片段构造查询。

// Notice the use of not exists here. If you do not want to check for the 'false' value,
// you can omit the first term filter here. 'T' is the type to which you are mapping your index.
// You should pass the field based on the structure of 'T'.
private static QueryContainer BuildNotExistsQuery()
{
    var boolQuery = new QueryContainerDescriptor<T>().Bool(
        b => b.Should(
            s => s.Term(t => t.Field(f => f.foo.IsMarried).Value(false)),
            s => !s.Exists(ne => ne.Field(f => f.foo.IsMarried))
        )
    );
}

你可以通过 NEST 项目中的客户端,如下所示。

var result = client.Search<T>(    
    .From(0)
    .Size(20)
    .Query(q => BuildNotExistsQuery())
    // other methods that you want to chain go here
)
nwwlzxa7

nwwlzxa72#

可以使用具有以下条件的should查询。
ismarried=假
一定不能结婚

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"
              }
            }
          }
        }
      ]
    }
  }
}

我希望你能把这个原始的dsl查询转换成nest!

相关问题