如何在Elastic Search中像“分组”索引字段那样执行SQL?

时间:2015-01-20 04:32:31

标签: elasticsearch

如何在' _search'上进行类似分组的SQL?在弹性搜索中查询?

我基本上需要:

1 - 使用多个过滤器,查询等过滤一大堆项目。完成

2 - 将这些结果放入唯一category_id的存储区中。 ' CATEGORY_ID'目前被映射为' float'项目文档类型的字段。我还需要在每个桶中显示与上述过滤器匹配的项目之一。

3 - 通过这些桶进行分页

注意:项目数量:1百万,独特category_id数量:60,000

我想获取所有数据类型'项目'由一个叫做的字段分组。在结果中,我想获得所有唯一的&category; class_id'并且在该组内的每个类别中的单个项目(第一个或任何项目,无关紧要)。我希望能够使用"来自"和"尺寸"通过这些结果进行分页。

例如,如果我有数据效果:

id:1, category_id: 1, color:'blue',
id:2, category_id: 1, color:'red',
id:3, category_id: 1, color:'red',
id:4, category_id: 2, color:'blue',
id:5, category_id: 2, color:'red',
id:6, category_id: 3, color:'blue',
id:7, category_id: 3, color:'blue',
id:8, category_id: 3, color:'blue',

例如,我希望得到所有具有颜色的红色' 然后按category_id分组,并返回数据:

category_id: 1
{
 item: { id:2, category_id: 1, color:'red'} 
},
category_id: 2
{
 item: { id:5, category_id: 2, color:'red'} 
}

这是我到目前为止所做的,但它没有得到正确的热门打击,我认为它不允许多个过滤器和查询,或者是可以分页的。

GET swap/item/_search
{
  "size": 0,
  "aggs": {
    "color_filtered_items": {
      "filter": {
        "and": [
          {
            "terms": {
              "color": [
                "red"
              ]
            }
          }
        ]
      },
      "aggs": {
        "group_by_cat_id": {
          "terms": {
            "field": "category_id",
            "size": 10
          },
          "aggs": {
            "items": {
              "top_hits": {
                "_source": {
                  "include": [
                    "name",
                    "id",
                    "category_id",
                    "color"
                  ]
                },
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}

黑客,解决方法,欢迎更改数据存储建议。任何帮助非常感谢。 谢谢大家:))

1 个答案:

答案 0 :(得分:0)

以下情况应该有效,假设您不需要基于数字范围的category_id聚合。

此外,您无法对聚合结果进行分页,但随后您可以控制每个聚合的大小。

{
  "aggs": {
    "itemsAgg": {
      "terms": {
        "field": "items",
        "size": 10
      },
      "aggs": {
        "categoryAgg": {
          "terms": {
            "field": "category_id",
            "size": 10
          }
        }
      }
    }
  }
}