字词汇总会传回多个栏位(min_doc_count:0)

时间:2019-02-11 14:57:49

标签: elasticsearch elasticsearch-aggregation

我正在创建Terms Aggregation,但我想返回多个字段。我希望用户通过“ slug”(我的名字)选择存储桶,但显示实际的“ name”(我的名字)。

此刻,我正在像这样进行TopHits子聚合:

"organisation": {
    "aggregations": {
        "label": {
            "top_hits": {
                "_source": {
                    "includes": [
                        "organisations.name"
                    ]
                },
                "size": 1
            }
        }
    },
    "terms": {
        "field": "organisations.slug",
        "min_doc_count": 0,
        "size": 20
    }
}

当我的整个查询实际找到一些存储桶/结果时,这将提供所需的结果。

您看到我将min_doc_count设置为0,这将返回文档计数为0的存储桶。我在这里面临的问题是我的TopHits响应为空,导致无法将正确的名称呈现给客户端。

示例响应:

"organisation": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
        "key": "my-name",
        "doc_count": 27,
        "label": {
            "hits": {
                "total": 27,
                "max_score": 1,
                "hits": [
                {
                    "_index": "users",
                    "_type": "doc",
                    "_id": "4475",
                    "_score": 1,
                    "_source": {
                    "organisations": [
                        {
                            "name": "My name"
                        }]
                    }
                }]
            }
        }
    },
    {
        "key": "my-name-2",
        "doc_count": 0,
        "label": {
            "hits": {
                "total": 0,
                "max_score": null,
                "hits": []
            }
        }
    },
    .....

有人完成了预期的结果吗?我觉得TopHits不会在这里帮助我。它应该始终获取名称。

我也尝试过的:

  • 使用术语子聚合。 (结果相同)
  • 使用重要术语子聚合。 (结果相同)

我认为可能是一种解决方案,但感觉很脏:

  • 用“ organisations.slug ___ organisations.name”为新字段建立索引,并以此来处理魔术。
  • 手动查询计数为0(读取的TopHits为空)的名称字段

亲切的问候, 预先感谢

0 个答案:

没有答案