gpt4 book ai didi

elasticsearch - 计算Elasticsearch中的子页面

转载 作者:行者123 更新时间:2023-12-02 22:31:31 25 4
gpt4 key购买 nike

我有一个类似文件的索引test:

POST /test/page/a
{
"Id": "a",
"Parent": "0"
}

POST /test/page/b
{
"Id": "b",
"Parent": "a"
}

POST /test/page/c
{
"Id": "c",
"Parent": "a"
}

POST /test/page/d
{
"Id": "d",
"Parent": "c"
}

也就是说,在逻辑 page层次结构中,如下所示:
0 (non existant)
|
`- a
|
> b
|
` c
|
` d

我可以找到所有 page等于 Parenta。我只是:
POST /test/page/_search
{
"query": {
"term": {
"Parent": "a"
}
}
}

答案(缩写):
{
"hits": {
"total": 2,
"hits": [
{
"_index": "test",
"_type": "page",
"_id": "b",
"_source": {
"Id": "b",
"Parent": "a"
}
},
{
"_index": "test",
"_type": "page",
"_id": "c",
"_source": {
"Id": "c",
"Parent": "a"
}
}
]
}
}

现在,在客户端,我可以构建根元素及其直接子代的树状 View 。

但是,我也想知道直系子女与(刚刚列出的)子女的数量。

我想要一个类似的答案:
{
"hits": {
"total": 2,
"hits": [
{
"_index": "test",
"_type": "page",
"_id": "b",
"_source": {
"Id": "b",
"Parent": "a"
},
"_numberOfChildren": 1
},
{
"_index": "test",
"_type": "page",
"_id": "c",
"_source": {
"Id": "c",
"Parent": "a"
},
"_numberOfChildren": 0
}
]
}
}

我希望ES通过某种“子查询”来动态计算 _numberOfChildren

答案也许是合计的?

也许 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-children-aggregation.html吗?

最佳答案

如果没有很多物品:

您只能使用一个查询来检索信息:

GET /test/page/_search
{
"filter": {
"term": {
"Parent": "0"
}
},
"aggs": {
"numberOfChildren": {
"terms": {
"field": "Parent",
"size": 0
}
}
}
}

在响应中, hits.hits将包含 0的子级。

对于每个节点,您将在 aggregations.numberOfChildren.buckets中具有以下结构的子级数:
{
"key": [page id],
"doc_count": [number of children for this page]
}

响应示例:
{
...
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "page",
"_id": "a",
"_score": 1,
"_source": {
"Id": "a",
"Parent": "0"
}
}
]
},
"aggregations": {
"numberOfChildren": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "0",
"doc_count": 1
},
{
"key": "a",
"doc_count": 2
},
{
"key": "c",
"doc_count": 1
}
]
}
}

请不要这样:
  • 如果该页面没有任何字母,则它不在列表中。
  • 您拥有所有 parent 的 child 数量,而不仅仅是直接0的子项,因此,如果您有很多项(太多),它将中断
    桶)。

  • 如果您有很多物品:

    最简单的方法是使用两个查询:
    GET /test/page/_search
    {
    "query": {
    "filtered": {
    "filter": {
    "term": {
    "Parent": "0"
    }
    }
    }
    }
    }

    您的 hits.hits中将有0个直接子级。

    第二个查询:
    GET /test/page/_search
    {
    "size": 0,
    "query": {
    "filtered": {
    "filter": {
    "terms": {
    "Parent": [
    "a" // list 0's direct children ids
    ]
    }
    }
    }
    },
    "aggs": {
    "numberOfChildren": {
    "terms": {
    "field": "Parent",
    "size": 0,
    "order": {
    "_term": "asc"
    }
    }
    }
    }
    }
    aggregations.numberOfChildrens.buckets中将有0个直系子代的子代数

    您也许也可以使用脚本,但是我不确定它们是否可以在这种情况下工作。

    亲子关系对您没有帮助,因为 parent 和 child 不能属于同一类型。

    关于elasticsearch - 计算Elasticsearch中的子页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36667051/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com