java - 基于嵌套数组的Elasticsearch聚合查询

标签 java elasticsearch indexing elasticsearch-5

我的索引中确实有如下文档

{
      "bookName" : "coolbook",
      "timeStamp" : "2018-11-19T12:52:17.000Z",
      "referenceId" : "auth_test_01_01_000004",
      "peoplestatus" : [
        {
          "personId" : "p1",
          "status" : "like"
        },
        {
          "personId" : "p2",
          "status" : "dislike"
        },{
          "personId" : "p3",
          "status" : "netrual"
        }
      ]
    }

现在我想查询 p1,p2 的图书数量聚合,如下所示 图书数量

  1. p1 喜欢但 p2 不喜欢
  2. p1、p2 都喜欢
  3. p2 不喜欢但 p1 喜欢
  4. p1、b2 都不喜欢

感谢您的帮助

最佳答案

由于您需要每个存储桶具有不同过滤器的存储桶,filters aggregation最适合这个。 根据您的评论,将有两个人员 ID 进行比较,以下是对以下两个组合的查询:

  • P1 喜欢但 P2 不喜欢
  • P1 和 P2 都喜欢


    {
      "query": {
        "match_all": {}
      },
      "aggs": {
        "books": {
          "filters": {
            "filters": {
              "P1L_P2DL": {
                "bool": {
                  "must": [
                    {
                      "nested": {
                        "path": "peoplestatus",
                        "query": {
                          "bool": {
                            "must": [
                              {
                                "bool": {
                                  "must": [
                                    {
                                      "term": {
                                        "peoplestatus.personId": "p1"
                                      }
                                    },
                                    {
                                      "term": {
                                        "peoplestatus.status": "like"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    },
                    {
                      "nested": {
                        "path": "peoplestatus",
                        "query": {
                          "bool": {
                            "must": [
                              {
                                "bool": {
                                  "must": [
                                    {
                                      "term": {
                                        "peoplestatus.personId": "p2"
                                      }
                                    },
                                    {
                                      "term": {
                                        "peoplestatus.status": "dislike"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              },
              "L1N3": {
                "bool": {
                  "must": [
                    {
                      "nested": {
                        "path": "peoplestatus",
                        "query": {
                          "bool": {
                            "must": [
                              {
                                "bool": {
                                  "must": [
                                    {
                                      "term": {
                                        "peoplestatus.personId": "p1"
                                      }
                                    },
                                    {
                                      "term": {
                                        "peoplestatus.status": "like"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    },
                    {
                      "nested": {
                        "path": "peoplestatus",
                        "query": {
                          "bool": {
                            "must": [
                              {
                                "bool": {
                                  "must": [
                                    {
                                      "term": {
                                        "peoplestatus.personId": "p2"
                                      }
                                    },
                                    {
                                      "term": {
                                        "peoplestatus.status": "like"
                                      }
                                    }
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      },
      "size": 0
    }


关于java - 基于嵌套数组的Elasticsearch聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414388/

相关文章:

java - 使用 Axis 客户端 API 时,将 HTTP header 添加到未调用的 HTTP 请求的处理程序

java - Spring数据MongoTemplate更新嵌套数组失败

java - 在多个gradle子项目之间共享类路径配置

java - 如何将InputStream对象转换为File对象?

json - 无法加载json映射Elasticsearch

json - 将Scala对象序列化为Json并索引为Elasticsearch时出现NotXContentException

java - elasticsearch 未启动 {0.90.0} : Startup Failed

python - 通过条件在 pandas csv 文件中创建新列

algorithm - 计算数字组合的索引

Mysql Group By 查询性能非常慢