如何在嵌套对象上进行聚合 - Elasticsearch

时间:2018-04-17 11:31:26

标签: elasticsearch nested elasticsearch-aggregation

我对Elasticsearch很新,所以请耐心等待。 这是我在ES中的文件的一部分。

{
  "source": {
    "detail": {
      "attribute": {
        "Size": ["32 Gb",4],
        "Type": ["Tools",4],
        "Brand": ["Sandisk",4],
        "Color": ["Black",4],
        "Model": ["Sdcz36-032g-b35",4],
        "Manufacturer": ["Sandisk",4]
      }
    },
    "title": {
      "list": [
        "Sandisk Cruzer 32gb Usb 32 Gb Flash Drive , Black - Sdcz36-032g"
      ]
    }
  }
}

所以我想要实现的是找到属性对象的最佳三个或前三个命中。例如,如果我搜索“sandisk”,我想获得三个属性,如["Size", "Color", "Model"]或基于热门命中聚合的任何属性。 所以我做了这样的查询

{
  "size": 0,
  "aggs": {
    "categoryList": {
      "filter": {
        "bool": {
          "filter": [
            {
              "term": {
                "title.list": "sandisk"
              }
            }
          ]
        }
      },
      "aggs": {
        "results": {
          "terms": {
            "field": "detail.attribute",
            "size": 3
          }
        }
      }
    }
  }
}

但似乎没有用。我该如何解决?任何提示都会非常感激。

这是_mappings。它不是完整的,但我想这就足够了。

{
  "catalog2_0": {
    "mappings": {
      "product": {
        "dynamic": "strict",
        "dynamic_templates": [
          {
            "attributes": {
              "path_match": "detail.attribute.*",
              "mapping": {
                "type": "text"
              }
            }
          }
        ],
        "properties": {

          "detail": {
            "properties": {
              "attMaxScore": {
                "type": "scaled_float",
                "scaling_factor": 100
              },
              "attribute": {
                "dynamic": "true",
                "properties": {
                  "Brand": {
                    "type": "text"
                  },
                  "Color": {
                    "type": "text"
                  },
                  "MPN": {
                    "type": "text"
                  },
                  "Manufacturer": {
                    "type": "text"
                  },
                  "Model": {
                    "type": "text"
                  },
                  "Operating System": {
                    "type": "text"
                  },
                  "Size": {
                    "type": "text"
                  },
                  "Type": {
                    "type": "text"
                  }
                }
              },
              "description": {
                "type": "text"
              },
              "feature": {
                "type": "text"
              },
              "tag": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              }
            }
          },

          "title": {
            "properties": {

              "en": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

  • 根据documentation,您无法在具有text数据类型的字段上进行聚合。它们必须具有keyword数据类型。

  • 然后你不能以这种方式在detail.attribute字段上进行聚合:detail.attribute字段不存储任何值:它是object数据类型 - 不是正如您在问题中所写的那样nested,这意味着它是其他字段的容器,例如SizeBrand等。因此您应该对detail.attribute.Size字段进行汇总 - 例如,如果这个是keyword数据类型。

  • 另一个可能的错误是您尝试在term数据类型上运行text查询 - title.list字段的数据类型是什么? Term查询是具有keyword数据类型的字段的特权,而match查询用于查询text数据类型

答案 1 :(得分:0)

这是我用于嵌套aggs查询的内容,减去实际值名称。 实际字段是一个关键字,如前所述,它是嵌套JSON对象的一部分:

"STATUS_ID": {
                "type": "keyword",
                "index": "not_analyzed",
                "doc_values": true
              },

<强>查询

  GET index name/_search?size=200
    {
      "aggs": {
        "panels": {
          "nested": {
            "path": "nested path"
          },
          "aggs": {
            "statusCodes": {
              "terms": {
                "field": "nested path.STATUS.STATUS_ID",
                "size": 50
              }
            }
          }
        }
      }
    }

<强>结果

"aggregations": {
    "status": {
      "doc_count": 12108963,
      "statusCodes": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "O",
            "doc_count": 5912218
          },
          {
            "key": "C",
            "doc_count": 401586
          },
          {
            "key": "E",
            "doc_count": 135628
          },
          {
            "key": "Y",
            "doc_count": 3742
          },
          {
            "key": "N",
            "doc_count": 1012
          },
          {
            "key": "L",
            "doc_count": 719
          },
          {
            "key": "R",
            "doc_count": 243
          },
          {
            "key": "H",
            "doc_count": 86
          }
        ]
      }
    }