Elasticsearch:如何将聚合范围扩展到您的查询和过滤器?

Man*_*ngh 6 elasticsearch

我一直在使用elasticsearch查询和过滤一段时间但以前从未使用过聚合.我们可以使用我们的查询来定义聚合的想法对我来说似乎相当惊人,但我想要了解如何正确地做到这一点,这样我就不会犯任何错误.目前我的所有搜索查询都是这样设计的:

{
    "query": {

    },
    "filter": {

    },
    "from": 0,
    "size": 60
}
Run Code Online (Sandbox Code Playgroud)

现在,当我添加一些聚合桶时,结构变为:

{
    "aggs": {
      "all_colors": {
        "terms": {
          "field": "color.name"
        }
      },
      "all_brands": {
        "terms": {
          "field": "brand_slug"
        }
      },
      "all_sizes": {
        "terms": {
          "field": "sizes"
        }
      }
    },
    "query": {

    },
    "filter": {

    },
    "from": 0,
    "size": 60
}
Run Code Online (Sandbox Code Playgroud)

但是,无论我在过滤器中提供什么信息,聚合的结果总是相同的.

现在,当我将查询结构更改为类似的内容时,它开始显示不同的结果:

{
    "aggs": {
      "all_colors": {
        "terms": {
          "field": "color.name"
        }
      },
      "all_brands": {
        "terms": {
          "field": "brand_slug"
        }
      },
      "all_sizes": {
        "terms": {
          "field": "sizes"
        }
      }
    },
    "query": {
        "filtered": {
            "query": {

            },
            "filter": {

            }        
        }
    },
    "from": 0,
    "size": 60
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我必须将搜索查询的结构更改为这种新的过滤类型的结构?还有其他解决方法可以让我在不改变那么多代码的情况下实现预期的结果吗?

另外,我观察到的另一件事是,如果我的brand_slug字段包含多个关键字,如"peter england",那么这两个关键字都会在不同的桶中返回,如下所示:

{
    "buckets": [
        {
           "key": "england",
           "doc_count": 368
        },
        {
           "key": "peter",
           "doc_count": 368
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我如何确保这两者最终都在这样的桶中:

{
    "buckets": [
        {
           "key": "peter england",
           "doc_count": 368
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

更新:第二部分我能够通过不同的方式索引品牌,颜色和尺寸来实现:

"sizes": {
    "type": "string",
    "fields": {
        "raw": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

bit*_*kar 6

您注意到的是设计使然。看看对 SO 上类似问题的回答。基本上,聚合部分和过滤部分的输入都是查询部分的输出。您建议的过滤查询将是实现您想要的结果的最佳方式。还有另一种方式。您可以使用过滤器聚合。然后,您不需要更改查询和过滤器部分,而只需复制聚合部分内的过滤器部分,但在我看来,这通常是一种矫枉过正,并且违反了DRY 原则