如何在聚合中合并相似项目?

时间:2019-05-15 16:26:33

标签: javascript elasticsearch

我正在尝试创建滤色器。返回的颜色通常是正常的,但还有很多其他的颜色。例如,我的结果显示如下:

{ key: "WHITE", doc_count: 300 }, 
{ key: "OFFWHITE", doc_count: 2 }, 
{ key: "SUPER WHITE", doc_count: 1 }

我的汇总如下:


aggs: {
    Color: {
        terms: {
            field: 'colors.keyword',
            size: 100,
        },
    },
}

我想将所有包含“白色”的东西组合到一个桶中。与其他顶部颜色相同。这可能吗?

2 个答案:

答案 0 :(得分:1)

另一种解决方法是使用.ajax function。此处的过滤器可以是与颜色匹配的filter aggregation

聚合如下所示:

primary_color

以上内容不需要任何脚本。但是正如Kamal所建议的那样,最好的方法是拥有一个单独的字段,例如{ "name":"BarcodeScannerApp", "integrations": { "cordova": {} }, "type":"angular", "proxies":[ { "proxyUrl":"http://localhost:8085" } ] } 并对其进行汇总。

答案 1 :(得分:0)

我提出了以下使用Terms Aggregation using Script的查询。

请注意,我仅添加了WHITEBLUE的条件。这是一个简单的,如果您的字符串包含一种颜色作为子字符串,则返回适当的原色/顶部颜色作为键

您可能必须弄清正在使用的独特的上色,并向脚本中添加条件,以便获得所需的内容。

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "Color": {
      "terms": {
        "script": {
          "source": """
          String st = doc['colors.keyword'].value;
          if(st.toLowerCase().contains("white"))
            return "WHITE";
          else if(st.toLowerCase().contains("blue"))
            return "BLUE";
          """,
          "lang": "painless"
        }
      }
    }
  }
}

现在,如果您有很多这样的颜色,那么最好使用一种更好的方法/解决方案,那就是尝试重新添加带有附加字段的文档(将其设置为primary_color),并确保此值字段将仅包含{/ {1}}之类的原色/顶部色。

这样,您可以在这个新字段上进行汇总(white, blue, green, yellow,使汇总查询更加高效。

让我知道这是否有帮助!