原始嵌套聚合

时间:2016-05-18 12:12:47

标签: elasticsearch

我想在ElasticSearch中创建一个原始的嵌套聚合,但我能让它运行起来。

我的文件如下:

{
    "_index": "items",
    "_type": "frame_spec",
    "_id": "19770602001",
    "_score": 1,
    "_source": {
      "item_type_name": "frame_spec",
      "status": "published",
      "creation_date": "2016-02-18T11:19:15Z",
      "last_change_date": "2016-02-18T11:19:15Z",
      "publishing_date": "2016-02-18T11:19:15Z",
      "attributes": [
        {
          "brand": "Sun"
        },
        {
          "model": "Sunglasses1"
        },
        {
          "eyesize": "56"
        },
        {
          "opc": "19770602001"
        },
        {
          "madein": "UNITED KINGDOM"
        }
      ]
    }
  }

我想要做的是根据其中一个属性进行聚合。我无法使用“attributes.model”(例如)进行常规聚合,因为其中一些包含空格。所以我尝试使用“原始”属性,但似乎ES认为它是一个普通的属性,并且不会返回任何结果。

这是我尝试过的:

{
    "size": 0,
    "aggs": {
        "brand": {
            "terms": {
                "field": "attributes.brand.raw"
            }
        }
    }
}

但我没有结果。

你能解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您应该在映射中使用dynamic_template来捕获所有attributes.*字符串字段,并为所有字符串创建raw子字段。对于除字符串之外的其他类型,您实际上不需要raw个字段。您需要删除当前索引,然后使用以下内容重新创建它:

DELETE items

PUT items
{
  "mappings": {
    "frame_spec": {
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "string",
            "path_match": "attributes.*",
            "mapping": {
              "type": "string",
              "fields": {
                "raw": {
                  "type":  "string",
                  "index": "not_analyzed",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      ]
    }
  }
}

之后,您需要重新填充索引,然后才能运行此命令:

POST /items/_search
{
    "size": 0,
    "aggs": {
        "brand": {
            "terms": {
                "field": "attributes.brand.raw"
            }
        }
    }
}