与ElasticSearch中的几个字段不同

时间:2019-08-06 13:03:48

标签: elasticsearch

我需要从ElasticSearch索引中获取几个字段的不同值-但它必须作为一个集合是不同的,就像在MySQL查询中一样:

np.dtype([('point', 'f8', (4,)), ('rgb', 'uint8', (4,)), ('something', 'uint8', (4,))])

直到现在,我已经尝试了一些方法来获取此信息,但是对我而言,所有方法都失败了:

1。聚合

SELECT DISTINCT name, type from some_table;

2。脚本 下面的代码返回两个字段的所有可用组合,但不仅返回真正存在的对。

GET test_index/_search
{
    "size": 0,
    "track_total_hits": false,
    "aggs" : {
        "features": {
            "terms": {
                "field" : "feature.name",
                "size" : 10,
                "order": {
                    "_key": "asc"
                }
            }
        }
    }
}

示例代码:

GET bm_upgraded_visitors/_search
{
    "size": 0,
    "aggs": {
        "t": {
           "terms": {
               "script": "doc['feature.name'].values + ' | ' + doc['feature.type'].values"
           }
       }
    }
}

示例文档:

PUT test_index
{
  "mappings" : {
    "_doc" : {
      "dynamic" : "false",
      "properties" : {
        "features" : {
            "type": "nested",
            "include_in_root": true,
            "properties" : {
              "name" : {
                "type" : "keyword"
              },
              "value" : {
                "type" : "text"
              },
              "type": {
                "type" : "keyword"
              }
            }
        }
      }
    }
  }
}

所需结果:

PUT test_index/_doc/1
{
    "features": [
      {
      "name": "Feature 1",
      "value": "Value 1",
      "type": "Type 1"
      },
      {
      "name": "Feature 2",
      "value": "Value 1",
      "type": "Type 2"
    }
    ]
}

1 个答案:

答案 0 :(得分:0)

然后,您需要另一个术语子聚合。试试这个:

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Could not upgrade websocket connection")
        log.Println(err)
        return
    }

    vars := mux.Vars(r)
    if !clientConnected(vars["id"], conn) {
        return
    }
    defer closeConnection(vars["id"], conn)
    for {
        msgType, msg, err := conn.ReadMessage()
        if err != nil {
            break
        }

        log.Printf("%s sent: %s", vars["id"], string(msg))

        // ... stuff ...
    }
}