elasticsearch 弹性网格中的嵌套布尔聚合
我有json有效负载elasticsearch 弹性网格中的嵌套布尔聚合,elasticsearch,kibana,elasticsearch,Kibana,我有json有效负载 { "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 61, "relation" : "eq" }, "max_score" : 1.0,
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 61,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "myindex",
"_type" : "_doc",
"_id" : "CAojVWwBO8H0jj7a_j3P",
"_score" : 1.0,
"_source" : {
"appName" : "BigApp",
"appVer" : "1.0",
"reviews" : {
"reviewer" : {
"value" : "Bob"
},
"testsPass" : [
{
"name" : "unit",
"pass" : false
},
{
"name" : "integraton",
"pass" : false
},
{
"name" : "ui",
"pass" : false
}
]
}
}
}
]
}
}
在elastic中,如果所有的pass
值都为true,我希望聚合testsPass
下的布尔值以返回true
我对弹性是个新手,正在努力写一个这样的查询,有人能帮我吗
到目前为止,我已经尝试过了,但语法不正确。查看您的数据,我假设您的映射结构如下所示: 映射: 样本文件: 请注意,在上述文档的列表中,只有具有
appName:MidApp
(第二个文档)的文档具有所有true
值的列表
聚合查询:
请注意,以上仅返回相关文档作为结果。这里的主要聚合在filter部分,它只是一个
答复:
基本上,两个查询中的核心执行逻辑都是相同的,我只是缩小了您要查找的逻辑范围
答复:
希望这有帮助 这就是你想做的吗
testPass
数组应该包含pass
astrue
以便所有对象返回true
否则返回false
?@JBone正确,对于该数组中的所有项,它是一个逻辑and。在这种情况下,为什么不查询pass:false
,并基于查询结果,如果文档计数不止一个,则有pass=fail
文档,如果没有,则所有文档都有pass=true
?这个逻辑行得通吗?如果是这样,我可以写query@JBone那不是我想要的。例如,我有10个文档,每个文档都有这些文档的数组。只有当特定文档中的所有项都具有pass:trues时,它才应该返回该文档。感谢您的深入回答,但它在Kibana7.2中不起作用。我发现路径[reviews.testsPass]下的错误[nested]嵌套对象不是嵌套类型,并且状态非法。它在ES7.2中也能工作。从上面的注释来看,您的案例中没有嵌套的类型。Elasticsearch中的嵌套
类型和对象
类型之间存在差异。你能在你的问题中更新该索引的映射吗?根据我在回答中提到的映射,查询工作正常。只要做一个http://host:port/myindex/_mapping?pretty
在您的浏览器中,分享您的观察结果。此外,如果您只需执行我提到的上述步骤,并了解如何从创建映射到运行查询,这将非常有用。我建议您花些时间来理解ES中的嵌套和对象类型。了解它们之间的差异非常重要,因为您可以相应地为文档建模。太好了,明白了:)
PUT myindex
{
"mappings": {
"properties": {
"appName":{
"type": "keyword"
},
"appVer": {
"type": "keyword"
},
"reviews":{
"properties": {
"reviewer":{
"properties":{
"value": {
"type": "keyword"
}
}
},
"testsPass":{
"type": "nested"
}
}
}
}
}
}
POST myindex/_doc/1
{
"appName":"BigApp",
"appVer":"1.0",
"reviews":{
"reviewer":{
"value":"Bob"
},
"testsPass":[
{
"name":"unit",
"pass":false
},
{
"name":"integraton",
"pass":false
},
{
"name":"ui",
"pass":false
}
]
}
}
POST myindex/_doc/2
{
"appName":"MidApp",
"appVer":"1.0",
"reviews":{
"reviewer":{
"value":"Bob"
},
"testsPass":[
{
"name":"unit",
"pass":true
},
{
"name":"integraton",
"pass":true
},
{
"name":"ui",
"pass":true
}
]
}
}
POST myindex/_doc/3
{
"appName":"SmallApp",
"appVer":"1.0",
"reviews":{
"reviewer":{
"value":"Bob"
},
"testsPass":[
{
"name":"unit",
"pass":true
},
{
"name":"integraton",
"pass":true
},
{
"name":"ui",
"pass":false
}
]
}
}
POST myindex/_search
{
"size":0,
"aggs":{
"pass_reviewers":{
"filter":{
"bool":{
"must":[
{
"nested":{
"path":"reviews.testsPass",
"query":{
"match":{
"reviews.testsPass.pass":"true"
}
}
}
}
],
"must_not":[
{
"nested":{
"path":"reviews.testsPass",
"query":{
"match":{
"reviews.testsPass.pass":"false"
}
}
}
}
]
}
},
"aggs":{
"myhits":{
"top_hits":{
"size":10
}
}
}
}
}
}
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"pass_reviewers" : {
"doc_count" : 1, <------ Note this. Returns count of docs. This is result of filtered aggregation
"myhits" : { <------ Start of top hits aggregation
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "myindex",
"_type" : "_doc",
"_id" : "2", <----- Document
"_score" : 1.0,
"_source" : {
"appName" : "MidApp",
"appVer" : "1.0",
"reviews" : {
"reviewer" : {
"value" : "Bob"
},
"testsPass" : [
{
"name" : "unit",
"pass" : true
},
{
"name" : "integraton",
"pass" : true
},
{
"name" : "ui",
"pass" : true
}
]
}
}
}
]
}
}
}
}
}
POST myindex/_search
{
"query":{
"bool":{
"must":[
{
"nested":{
"path":"reviews.testsPass",
"query":{
"match":{
"reviews.testsPass.pass":"true"
}
}
}
}
],
"must_not":[
{
"nested":{
"path":"reviews.testsPass",
"query":{
"match":{
"reviews.testsPass.pass":"false"
}
}
}
}
]
}
}
}
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.597837,
"hits" : [
{
"_index" : "myindex",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.597837,
"_source" : {
"appName" : "MidApp",
"appVer" : "1.0",
"reviews" : {
"reviewer" : {
"value" : "Bob"
},
"testsPass" : [
{
"name" : "unit",
"pass" : true
},
{
"name" : "integraton",
"pass" : true
},
{
"name" : "ui",
"pass" : true
}
]
}
}
}
]
}
}