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查询
我希望您可以将这个原始DSL查询转换为NEST 您可以使用具有以下条件的should查询
我希望您可以将这个原始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"
}
}
}
}
]
}
}
}