elasticsearch 弹性网格中的嵌套布尔聚合,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch 弹性网格中的嵌套布尔聚合,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch 弹性网格中的嵌套布尔聚合

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,

我有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,
    "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
as
true
以便所有对象返回
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
              }
            ]
          }
        }
      }
    ]
  }
}