在elasticsearch中,如何按计数排序

mnowg1ta  于 5个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(63)

我有两个表:用户和文章,现在我想得到一个用户列表,按每个人的文章与日期的范围。
设置elasticsearch索引:

PUT /users/_mapping
{
  "properties":{
    "id": {
      "type": "long"
    },
    "create_time": {
      "type": "date",
      "format": "yyyy-MM-dd"
    },
    "articles":{
      "type":"nested",
      "properties": {
        "id": {
          "type": "long"
        },
        "content": {
          "type": "text"
        },
        "create_time": {
          "type": "date",
          "format": "yyyy-MM-dd"
        }
      }
    }
  }
}

字符串
数据是这样的:

{
  "id":1,
  "create_time": "2023-12-20",
  "articles": [
    {"id": 21, "content":"1111", "create_time": "2023-12-20"},
    {"id": 22, "content":"1111", "create_time": "2023-12-21"},
    {"id": 23, "content":"1111", "create_time": "2023-12-21"},
    {"id": 24, "content":"1111", "create_time": "2023-12-22"},
    {"id": 24, "content":"1111", "create_time": "2023-12-23"}
  ]
}

{
  "id":2,
  "create_time": "2023-12-20",
  "articles": [
    {"id": 21, "content":"1111", "create_time": "2023-12-20"},
    {"id": 22, "content":"1111", "create_time": "2023-12-21"},
    {"id": 23, "content":"1111", "create_time": "2023-12-22"},
    {"id": 24, "content":"1111", "create_time": "2023-12-22"},
    {"id": 24, "content":"1111", "create_time": "2023-12-22"},
    {"id": 25, "content":"1111", "create_time": "2024-12-31"}
  ]
}

{
  "id":3,
  "create_time": "2023-12-20",
  "articles": [
    {"id": 21, "content":"1111", "create_time": "2023-12-20"},
    {"id": 22, "content":"1111", "create_time": "2023-12-21"},
    {"id": 23, "content":"1111", "create_time": "2023-12-21"},
    {"id": 24, "content":"1111", "create_time": "2023-12-21"},
    {"id": 24, "content":"1111", "create_time": "2023-12-22"},
    {"id": 25, "content":"1111", "create_time": "2024-12-31"}
  ]
}

{
  "id":4,
  "create_time": "2023-12-10",
  "articles": [
    {"id": 21, "content":"1111", "create_time": "2023-12-10"},
    {"id": 22, "content":"1111", "create_time": "2023-12-11"},
    {"id": 23, "content":"1111", "create_time": "2023-12-21"},
    {"id": 24, "content":"1111", "create_time": "2023-12-21"},
    {"id": 24, "content":"1111", "create_time": "2023-12-21"},
    {"id": 25, "content":"1111", "create_time": "2024-12-31"}
  ]
}


如果客户发布日期:2023-12-20和2023-12-21将获得:在2023-12-20和2023-12-21之间创建_time的用户;按在2023-12-20和2023-12-21之间创建_time的文章号排序;
因此,列表数据:id:3,4篇文章id:1,3篇文章id:2,2篇文章
没有id:4,因为create_time不在2023-12-20和2023-12-21之间
我的查询是这样的:

GET /users/_search
{
    "query": {
        "bool": {
            "must": [{
                "range": {
                    "create_time": {
                        "gte": "2023-12-20",
                        "lte": "2023-12-21"
                    }
                }
            }]
        }
    },
    "aggs": {
        "articles": {
            "nested": {
                "path": "articles"
            },
            "aggs": {
                "articles": {
                    "filter": {
                        "bool": {
                            "must": [{
                                "range": {
                                    "articles.create_time": {
                                        "gte": "2023-12-20",
                                        "lte": "2023-12-21",
                                        "format": "yyyy-MM-dd"
                                    }
                                }
                            }]
                        }
                    }
                }
            }
        }
    },
    "size": 0
}

wkftcu5l

wkftcu5l1#

您需要使用reverse_nested查询。以下是您更新的查询:

GET /users/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "create_time": {
              "gte": "2023-12-20",
              "lte": "2023-12-21"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "articles": {
      "nested": {
        "path": "articles"
      },
      "aggs": {
        "test": {
          "reverse_nested": {},
          "aggs": {
            "unique_count_of_id": {
              "terms": {
                "field": "id"
              },
              "aggs": {
                "article_count": {
                  "nested": {
                    "path": "articles"
                  },
                  "aggs": {
                    "filtered_article_count": {
                      "filter": {
                        "bool": {
                          "must": [
                            {
                              "range": {
                                "articles.create_time": {
                                  "gte": "2023-12-20",
                                  "lte": "2023-12-21",
                                  "format": "yyyy-MM-dd"
                                }
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

字符串


的数据

相关问题