如何处理方面筛选和相应的聚合计数?

时间:2019-03-27 12:06:55

标签: elasticsearch

大家好。问题涉及多面搜索。

假设有2个过滤器:

2.1类别 货运(1765) 汽车(1566) 其他(8675)

2.2种颜色 红色(5689) 绿色(156) 蓝色(3599) 黄色(2562)

正如我们在每个过滤器前面看到的那样,它指示了弹性中分别存储了多少个元素。 在“运费”前面打勾。

现在的行为:

2.1类别 货运(1765) 汽车(0) 还有(0)

2.2种颜色 红色(红色货号) 绿色(绿色货运数量) 蓝色(蓝色货运数量) 黄色(黄色货运数量)

您需要这种行为:

2.1类别 货运(1765) 汽车(1566) 其他(8675)

2.2种颜色 红色(红色货号) 绿色(绿色货运数量) 蓝色(蓝色货运数量) 黄色(黄色货运数量)

也就是说,特定字段上的过滤器不会影响其聚合,但会影响所有其他过滤器。如何实现优化?现在实现了x个请求弹性,并且x等于过滤器数量

最美好的祝愿

1 个答案:

答案 0 :(得分:0)

假设初始查询为match_all,则查询

  

2.1分类货运(1765)汽车(1566)其他(8675)

     

2.2颜色红色(5689)绿色(156)蓝色(3599)黄色(2562)

将是:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CATEGORIES": {
      "terms": {
        "field": "category"
      }
    },
    "COLORS": {
      "terms": {
        "field": "color"
      }
    }
  }
}

当选择 Freight 时,期望的解释如下:

1。过滤记录

这可以通过在category字段上查询字词来实现。现在,如果在聚合之前应用此查询,则会导致问题中提到的问题。 CATEGORIES方面将与Frieght相对,而其他计数将为零。尽管COLORS方面将具有预期的计数。为了解决这个问题,我们可以使用post_filter。这样可以确保在准备汇总后对记录进行过滤。

这是它的工作方式:

步骤1: match_all(原始查询)

步骤2:准备汇总

第3步:应用过滤器(预期的搜索结果)

通过上述操作,我们将获得正确的过滤结果和预期的数量CATEGORIES,但是COLORS中的数量仍然相同,根据CATEGORIES中的选择,预计数量会减少方面。下一步可以解决此问题。

2。其他方面的计数也将相应更改

为解决这个问题,我们将过滤器聚合与实际聚合一起使用。我们将在应进行计数的其余每个聚合中应用post_filter,即除CATEGORIES以外的所有聚合(在我们的情况下仅为COLORS

结合以上两个步骤,查询将是:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CATEGORIES": {
      "terms": {
        "field": "category"
      }
    },
    "COLORS": {
      "filter": {
        "terms": {
          "category": [
            "Freight"
          ]
        },
        "aggs": {
          "COLORS": {
            "terms": {
              "field": "color"
            }
          }
        }
      }
    },
    "post_filter": {
      "terms": {
        "category": [
          "Freight"
        ]
      }
    }
  }
}