elasticsearch中的动态方面.嵌套的方面



我有产品,有很多功能。Schema看起来像这样

[{
  name: "Test product 1",
  features: [
    ...
    {name: "color", value: "Blue"},
    {name: "size", value: "M"},
    ...
  ]
},{
  name: "Test product 2",
  features: [
    ...
    {name: "color", value: "Blue"},
    {name: "size", value: "XL"}
    ...
  ]
},{
  name: "Test product 3",
  features: [
    ...
    {name: "color", value: "White"},
    {name: "size", value: "XL"}
    ...
  ]
}]

我想要得到每个特征的每个不同值的facet。像这样:

{
  color: {
    Blue: 2,
    White: 1
  },
  size: {
    M: 1,
    XL: 2
  }
}

如何设计一个合适的索引模式和如何查询这些方面?我是否应该创建两个不同的数组,一个用于功能名称,另一个用于"对象"类型的项…然后进行多个查询,首先为功能名称,然后为每个嵌套的方面?…

对不起,我很困惑,不明白如何得到这个结果与facet

为什么要使用facet ?facet已被弃用,使用聚合…

这是一种使用facet和聚合进行搜索的方法。1. 创建索引并放置映射

PUT x3
POST x3/x2/_mapping
{
    "x2":{
        "properties": {
            "features" :{
                "type": "nested"
            }
        }
    }
}
POST x3/x2/1
{
  "name" :"Test product 1",
  "features": [
    {"name": "color", "value": "Blue"},
    {"name": "size", "value": "M"}
  ]
}
POST x3/x2/2
{
  "name": "Test product 2",
  "features": [
    {"name": "color", "value": "Blue"},
    {"name": "size", "value": "XL"}
  ]
}

使用facet搜索

POST x3/x2/_search
{
   "size": 0,
   "facets": {
      "sizeFacet": {
         "terms": {
            "field": "features.value",
            "size": 10000
         },
         "facet_filter": {
            "term": {
               "features.name": "color"
            }
         },
         "nested": "features"
      },
      "colorFacet": {
         "terms": {
            "field": "features.value",
            "size": 10000
         },
         "facet_filter": {
            "term": {
               "features.name": "size"
            }
         },
         "nested": "features"
      }
   }
}

使用聚合进行搜索。

POST x3/x2/_search
{
   "size": 0,
   "aggs": {
      "features": {
         "nested": {
            "path": "features"
         },
         "aggs": {
            "names": {
               "terms": {
                  "field": "features.name",
                  "size": 0
               },
               "aggs": {
                  "value": {
                     "terms": {
                        "field": "features.value",
                        "size": 0
                     }
                  }
               }
            }
         }
      }
   }
}

最新更新