簡體   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