Elasticsearch中的动态分面。嵌套分面?

3
我有很多产品,每个产品都有许多特性。数据结构看起来像这样:

[{
  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"}
    ...
  ]
}]

我希望能够获取每个特征不同值的外观。类似于这样的东西:
{
  color: {
    Blue: 2,
    White: 1
  },
  size: {
    M: 1,
    XL: 2
  }
}

如何设计一个合适的索引模式并如何查询这些facets?我应该创建两个不同的数组,一个用于功能名称,另一个包含类型为“object”的项...然后进行多次查询,先查询功能名称,再查询每个嵌套facet吗?...抱歉,我很困惑,不理解如何使用facets得到这个结果。
1个回答

3
为什么要使用facet?Facet已经过时了,应该使用aggregation。
以下是一种使用facet和aggregation进行搜索的方法: 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"}
  ]
}

使用分面搜索

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
                     }
                  }
               }
            }
         }
      }
   }
}

谢谢!Facets需要知道特征名称,但在我的情况下它是动态的(由用户提供),所以聚合是唯一的选择,而且它有效! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接