ElasticSearch嵌套聚合桶过滤

时间:2019-02-28 09:17:48

标签: elasticsearch search faceted-search elasticsearch-aggregation

我尝试基于标签/构面创建类似电子商务的搜索过滤器。 我的标签是动态创建和索引的,如下所示:

{
  "products": {
    "properties": {
      "name": {
        "type": "text"
      },
      "labels": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "keyword"
          },
          "typeId": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

我想像其他所有电子商务网站一样搜索标签类型(例如屏幕尺寸)的OR运算,以及标签类型之间的AND运算。 我可以使用以下查询进行此操作:

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "labels.id": [
              "45inch",
              "50inch"
            ]
          }
        },
         {
          "terms": {
            "labels.id": [
              "plasma",
              "led"
            ]
          }
        }
      ]
    }
  }
}

现在我想要标签聚合,当添加一个简单的聚合时,一切看起来都不错,但这不是因为我错过了值:每个聚合都需要依靠应用了所有过滤器的数据集,除了自己的过滤器(更多信息: https://madewithlove.be/faceted-search-using-elasticsearch/最后一部分)。 这是最基本的工作汇总,但已过滤(已应用查询过滤器):

 "aggs": {
    "productLabels": {
      "nested": {
        "path": "labels"
      },
      "aggs": {
        "innerAggregation": {
          "terms": {
            "field": "labels.typeId"
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "labels.id"
              }
            }
          }
        }
      }
    }
  }
}

因此,我需要带有一些过滤器的全局聚合,除了他自己的过滤器之外,我需要一些帮助来过滤聚合。我已经有了这个,但是这是不正确的,因为它现在可以过滤具有所有装配工(包括他自己的)的所有标签类型:

 "aggs": {
    "allLabels": {
      "global": {},
      "aggs": {
        "filteredLabels": {
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "labels.id": [
                      "45inch",
                      "50inch"
                    ]
                  }
                },
                {
                  "terms": {
                    "labels.id": [
                      "plasma",
                      "led"
                    ]
                  }
                }
              ]
            }
          },
          "aggs": {
            "nestedLabels": {
              "nested": {
                "path": "labels"
              },
              "aggs": {
                "labels": {
                  "terms": {
                    "field": "labels.typeId"
                  },
                  "aggs": {
                    "name": {
                      "terms": {
                        "field": "labels.id"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

有人知道如何实现这一目标吗?

非常感谢!

0 个答案:

没有答案