繁体   English   中英

如何获取 elasticsearch 查询中返回的多个字段?

[英]How to get multiple fields returned in elasticsearch query?

如何使用 elasticsearch 查询返回多个唯一字段?

我所有的文件都有重复的namejob字段。 我想使用 es 查询来获取所有唯一值,其中包括同一响应中的名称和工作,因此它们被捆绑在一起。

[
{
    "name": "albert",
    "job": "teacher",
    "dob": "11/22/91"
},
{
    "name": "albert",
    "job": "teacher",
    "dob": "11/22/91"
},
{
    "name": "albert",
    "job": "teacher",
    "dob": "11/22/91"
},
{
    "name": "justin",
    "job": "engineer",
    "dob": "1/2/93"
},
{
    "name": "justin",
    "job": "engineer",
    "dob": "1/2/93"
},
{
    "name": "luffy",
    "job": "rubber man",
    "dob": "1/2/99"
}
]

任何格式的预期结果 -> 我试图使用 aggs 但我只得到一个字段

[
    {
        "name": "albert",
        "job": "teacher"
    },
    {
        "name": "justin",
        "job": "engineer"
    },
    {
        "name": "luffy",
        "job": "rubber man"
    },

]

这是我到目前为止尝试过的

GET name.test.index/_search
{
  "size": 0,
    "aggs" : {
      "name" : {
        "terms" : { "field" : "name.keyword" }
      }
    }
}

使用上面的查询让我得到了这个,这很好,它是独一无二的

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 95,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "name" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Justin",
          "doc_count" : 56
        },
        {
          "key" : "Luffy",
          "doc_count" : 31
        },
        {
          "key" : "Albert",
          "doc_count" : 8
        }
      ]
    }
  }
}

我尝试进行嵌套聚合,但没有奏效。 是否有获取多个唯一值的替代解决方案,或者我错过了什么?

这是一个好的开始,有几种方法可以实现您想要的,每种方法都提供不同的响应格式。 所以你可以决定你喜欢哪一个。

第一个选项是利用top_hits子聚合并为每个名称存储桶返回两个字段:

GET name.test.index/_search
{
  "size": 0,
  "aggs": {
    "name": {
      "terms": {
        "field": "name.keyword"
      },
      "aggs": {
        "top": {
          "top_hits": {
            "_source": [
              "name",
              "job"
            ],
            "size": 1
          }
        }
      }
    }
  }
}

第二个选项是在您的术语聚合中使用script而不是字段来返回复合值:

GET name.test.index/_search
{
  "size": 0,
  "aggs": {
    "name": {
      "terms": {
        "script": "doc['name'].value + ' - ' + doc['job'].value"
      }
    }
  }
}

第三个选项是使用两个级别的字段折叠

GET name.test.index/_search
{
  "collapse": {
    "field": "name",
    "inner_hits": {
      "name": "by_job",
      "collapse": {
        "field": "job"
      },
      "size": 1
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM