繁体   English   中英

如何过滤 ElasticSearch 中的嵌套聚合?

[英]How to filter nested aggregations in ElasticSearch?

例如,假设我们有一个具有以下映射的产品索引:

 {
  "product": {
    "mappings": {
      "producttype": {
        "properties": {
          "id": {
            "type": "keyword"
          },
          "productAttributes": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "keyword"
              },
              "value": {
                "type": "keyword"
              }
            }
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "text",
                "analyzer": "keyword"
              }
            },
            "analyzer": "standard"
          }
        }
      }
    }
  }
}

我正在尝试使用以下查询查找有多少具有特定产品属性的产品(我使用模糊查询来允许一些编辑距离):

  {
  "size": 0,
  "query": {
    "nested": {
      "query": {
        "fuzzy": {
          "productAttributes.name": {
            "value": "SSD"
          }
        }
      },
      "path": "productAttributes"
    }
  },
  "aggs": {
    "product_attribute_nested_agg": {
      "nested": {
        "path": "productAttributes"
      },
      "aggs": {
        "terms_nested_agg": {
          "terms": {
            "field": "productAttributes.name"
          }
        }
      }
    }
  }
}

但它会返回每个匹配文档的所有产品属性,这是我得到的响应。

  "aggregations" : {
    "product_attribute_nested_agg" : {
      "doc_count" : 6,
      "terms_nested_agg" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "SSD",
            "doc_count" : 3
          },
          {
            "key" : "USB 2.0",
            "doc_count" : 3
          }
        ]
      }
    }
  }

您能否指导我如何过滤存储桶以仅返回匹配的属性?

编辑:以下是一些文档示例:

  "hits" : {
    "total" : 12,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "producttype",
        "_id" : "677d1164-c401-4d36-8a08-6aa14f7f32bb",
        "_score" : 1.0,
        "_source" : {
          "title" : "Dell laptop",
          "productAttributes" : [
            {
              "name" : "USB 2.0",
              "value" : "4"
            },
            {
              "name" : "SSD",
              "value" : "250 GB"
            }
          ]
        }
      },
      {
        "_index" : "product",
        "_type" : "producttype",
        "_id" : "2954935a-7f60-437a-8a54-00da2d71da46",
        "_score" : 1.0,
        "_source" : {
          "productAttributes" : [
            {
              "name" : "USB 2.0",
              "value" : "3"
            },
            {
              "name" : "SSD",
              "value" : "500 GB"
            }
          ],
          "title" : "HP laptop"
        }
      },
    ]
  }

要仅过滤特定内容,您可以使用filter查询。

询问:

{
  "size": 0,
  "aggs": {
    "product_attribute_nested_agg": {
      "nested": {
        "path": "productAttributes"
      },
      "aggs": {
        "inner": {
          "filter": {
            "terms": {
              "productAttributes.name": [
                "SSD"
              ]
            }
          },
          "aggs": {
            "terms_nested_agg": {
              "terms": {
                "field": "productAttributes.name"
              }
            }
          }
        }
      }
    }
  }
}

这就是它的诀窍:

"filter": {
  "terms": {
    "productAttributes.name": [
      "SSD"
    ]
  }
}

您需要过滤聚合的一部分。

Output:

"aggregations": {
  "product_attribute_nested_agg": {
    "doc_count": 4,
    "inner": {
      "doc_count": 2,
      "terms_nested_agg": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "SSD",
            "doc_count": 2
          }
        ]
      }
    }
  }
}

使用模糊过滤:

GET /product/_search
{
  "size": 0,
  "aggs": {
    "product_attribute_nested_agg": {
      "nested": {
        "path": "productAttributes"
      },
      "aggs": {
        "inner": {
          "filter": {
           "fuzzy": {
                "productAttributes.name": {
                  "value": "SSt",//here will match SSD
                  "fuzziness": 3//you can remove it to be as Auto
                }
              }
          },
          "aggs": {
            "terms_nested_agg": {
              "terms": {
                "field": "productAttributes.name"
              }
            }
          }
        }
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM