代码之家  ›  专栏  ›  技术社区  ›  Alan

对聚合中的值进行分组

  •  2
  • Alan  · 技术社区  · 6 年前

    我对Elasticsearch很陌生。

    我有这样一个查询:

    GET animals/_search
    
    {
      "aggregations" : {
        "top_animals" : {
          "terms" : {"field" : "animals", "size" : 10}
        }
      },
      "size" : 0
    }
    

    这会返回如下结果:

    {
      (...)
      "aggregations": {
        "top_animals": {
          (...)
          "buckets": [
            {
              "key": "dogs",
              "doc_count": 100
            },
            {
              "key": "whales",
              "doc_count": 70
            },
            {
              "key": "dolphins",
              "doc_count": 50
            },
            {
              "key": "cats",
              "doc_count": 10
            }
          ]
        }
      }
    }
    

    所以“狗”和“猫”是“宠物”,“海豚”和“鲸鱼”是“水生哺乳动物”。

    {
      (...)
      "aggregations": {
        "top_animals": {
          (...)
          "buckets": [
            {
              "key": "aquatic_mammals",
              "doc_count": 120
            },
            {
              "key": "pets",
              "doc_count": 110
            }
          ]
        }
      }
    }
    

    我应该如何修改我的查询?

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stock Overflaw    6 年前

    如果我理解你的话,价值观 pets aquatic 不是存储数据的一部分吗?

    可能有一个脚本的方法(我不能测试,所以。。。祝你好运,比如:

    GET animals/_search
    
    {
      "aggregations" : {
        "top_animals" : {
          "terms" : {
            "field": "animals",
            "script" : {
              "source": """
                if (_value == 'cats' || _value == 'dogs') {
                  return 'pets';
                } else if (_value == 'whales' || _value == 'dolphins') {
                  return 'aquatic';
                } else {
                  return 'alien';
                }
              """,
              "lang": "painless"
            },
            "size" : 10
          }
        }
      },
      "size" : 0
    }
    

    _value "field" 是目标。检查术语聚合 documentation .

    写起来很无聊,因为 switch doesn't seem to exist