gpt4 book ai didi

elasticsearch - ElasticSearch中唯一嵌套文档的数量

转载 作者:行者123 更新时间:2023-12-03 00:06:33 26 4
gpt4 key购买 nike

问题域的信息亭中有许多 token 显示。 token 仅由一个发行者发行,并且可以存在于多个信息亭中。信息亭逻辑根据该信息亭上存在的 token 来接受/拒绝用户。

我们的 flex 映射是这样的:

"mappings": {
"Kiosk": {
"dynamic": "strict",
"properties": {
"kioskId": {
"type": "keyword"
},
"token": {
"type": "nested",
"include_in_parent": true,
"properties": {
"tokenId": {
"type": "keyword"
},
"issuer": {
"type": "keyword"
}
}
}
}
}
}

这是两个典型的文档:
Kiosk1  
"kioskId": "123",
"token": {
"tokenId": "fp1",
"issuer": "i1"

Kiosk2
"kioskId": "321",
"token": [
{
"tokenId": "fp1",
"issuer": "i1"
},
{
"tokenId": "fp2",
"issuer": "i2"
}
]

现在,要问的是找到发行人存储在系统中的所有唯一 token 的数量。找到他们没有运气。我们尝试了以下查询:
POST _search
{
"aggs": {
"state": {
"nested": {
"path": "token"
},
"aggs": {
"TOKENS_BY_ISSUER": {
"terms": {
"field": "token.issuer"
}
}
}
}
}
}

这显然可以得出以下结果:
"aggregations": {
"state": {
"doc_count": 3,
"TOKENS_BY_ISSUER": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "i1",
"doc_count": 2
},
{
"key": "i2",
"doc_count": 1
}
]
}
}
}

是否有办法知道系统中只有两个 token 分别由i1和i2发行?像这样
"buckets": [
{
"key": "i1",
"doc_count": 1
},
{
"key": "i2",
"doc_count": 1
}
]

如果没有,映射哪里出错了?我觉得这并不是一个不寻常的映射。请注意,为简洁起见,我已将此处发布的映射缩短了,我们在 token 下还嵌套了一些级别。这些附加的嵌套级别包含特定于 token 及其父信息亭的字段。

最佳答案

您可以更改查询以匹配这样的内容

    {
"query": {
"match_all": {}
},
"aggs":{
"state": {
"nested": {
"path": "token"
},
"aggs": {
"TOKENS_BY_ISSUER": {
"terms": {
"field": "token.issuer"
},
"aggs":{
"distinct_tokens":{
"cardinality":{"field":"token.tokenId"}
}
}
}
}
}
}
}

注意:
  • elasticsearch中的基数聚合使用HyperLogLog近似技术来计算存储桶中的唯一字段值时,具有与其相关的错误率,因此错误率会随着系统中 token 数量的增加而增加。
  • 索引kiosk1文档时, token 应为 vector /数组,以确保索引时没有做错任何事情。

  • 为了提高基数聚合的准确性,请尝试在POST查询中增加precision_threshold Controller 。这需要付出更多的内存利用率。

    结帐链接以获取更多详细信息
    Elasticsearch Cardinality Aggregation

    宁愿建议您根据需求设计此方法,并且仅当您准备接受小于比例的误差百分比时才设计。

    关于elasticsearch - ElasticSearch中唯一嵌套文档的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612266/

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