elasticsearch 如何按具有多个值的同一字段进行分组?

k0pti3hp  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(214)

当我搜索elasticsearch聚合时,我只找到了multi_terms,它用来按多个字段分组。但我正在寻找如何按一个具有多个值的字段分组。
我有一个字段product,其值可以是fruitelectronicvegfurniture等。我想按值为fruitveg的所有文档进行分组。我该如何实现?
我正在寻找一种不更新索引Map的方法,由于product的值经常改变,我需要在运行时支持组字段的任何组合。

rggaifut

rggaifut1#

可以将脚本与术语聚合沿着使用。
我已经使用了runtime_mapping,这是一个脚本,它将为产品蔬菜和水果发出单个值,您可以使用该值对数据进行分组。
您也可以为runtime fields建立索引以改善效能。

{
  "runtime_mappings": {
    "product_custom": {
      "type": "keyword",
      "script": {
        "source": """
                      if(doc["product.keyword"].value=="vegetable" 
                        || doc["product.keyword"].value=="fruit")
                      {
                        emit("vegetable/fruit");  
                      }
                      else
                      {
                        emit(doc["product.keyword"].value);
                      }
                  """
      }
    }
  },
  "aggs": {
    "product_custom": {
      "terms": {
        "field": "product_custom"
      }
    }
  }
}

结果

"aggregations" : {
    "product_custom" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "vegetable/fruit",
          "doc_count" : 3
        },
        {
          "key" : "electronic",
          "doc_count" : 1
        }
      ]
    }
  }

更新

运行时字段从7.11版开始可用
您还可以在聚合方面使用脚本来实现相同

{
  "aggs": {
    "product_custom": {
      "terms": {
        "script": {
          "source": """
                     if(doc["product.keyword"].value=="vegetable" 
                        || doc["product.keyword"].value=="fruit")
                      {
                        return "vegetable/fruit";  
                      }
                      else
                      {
                        return doc["product.keyword"].value;
                      }
                    """
        }
      }
    }
  }
}

脚本和运行时Map速度慢,因为所有操作都是在搜索时完成的。您可以将运行时字段添加到索引中,而无需重新创建索引。它将给予比脚本更好的性能

相关问题