使用ElasticSearch获取所有可能的类别聚合

时间:2015-04-16 13:03:39

标签: elasticsearch aggregation

我对ElasticSearch很陌生,我认为我在脑子里犯了一些错误,关于它应该如何工作。我无法通过谷歌找到帮助,也不确定是因为我,还是因为ElasticSearch仍然很新。

我们是一家电子商务公司。我们拥有一个坚实的平台,客户可以在其上管理和销售产品。它们可以有多个子平台,并且可以为每个子平台启用/禁用产品。

因此,每个ElasticSearch过滤器(聚合,方面,无论名称是什么 - 我真的可以选择ES字典)都必须默认过滤此子平台ID。对于Solr,我可以查看每个文档应该是什么样子,但到目前为止还没有ES的喜悦。

我认为这将是

的内容
<doc>
  <field name="subplatforms">[1, 120, 360]</field>
  <field name="name">Product 1</field>
  <field name="categories">['Apparel', 'Shoes', 'Nike']</field>
</doc>

这是Solr中的XML文件应该是什么样子,但由于ES没有这样的东西,我只是这样写出来。

要显示每个所选类别的过滤器,搜索将类似于:

curl -XPOST "http://localhost:9200/products/_search" -d'
{
  "size": 0, 
  "aggregations": {
    "filter": {
      "term": { "category": "Shoes"
      }
    }
  }
}'

右?我们不希望显示类别的存储桶,因为这是在ElasticSearch之外完成的。但是,我们确实希望在桶中显示所选类别中每个可能选择的所有聚合。对于每个具有“鞋子”类别的产品,它应该找到所有可能的聚合(如何定义它们?),如鞋码,鞋带颜色,鞋带类型(平/圆)等。

我很困惑,到目前为止,我找到的所有资源都没有帮助我。新手文档确实缺乏。

1 个答案:

答案 0 :(得分:5)

如果您有以下文件:

curl -XPOST 'http://localhost/test/product' -d'
{
  "name": "Product 1",
  "categories":["Apparel", "Shoes", "Nike"],
  "shoesize":[38, 39, 40],
  "lacecolor": "blue"
 }'

curl -XPOST 'http://localhost/test/product' -d'
{
  "name": "Product 2",
  "categories":["Shoes"],
  "shoesize":[38, 39, 40, 41],
  "lacecolor": "red"
 }'  

然后获得一个聚类,首先按类别分组,然后穿鞋和鞋带颜色桶:

curl -XGET 'http://localhost/test/product/_search?pretty' -d '{
 "query": { "match_all": { } },
    "aggs" : {
        "category_agg" : { 
           "terms" : { "field" : "categories" } ,
           "aggs" : {
             "shoesize_agg" : { "terms" : { "field" : "shoesize" } },
             "lacecolor_agg" : { "terms" : { "field" : "lacecolor" } }
           }
        }
    }
}'

如果你想对聚合进行过滤 - 例如因为用户已搜索特定术语或选择了一个类别,我会将该标准放在查询语句中(即不是agg过滤器):

curl -XGET 'http://localhost/test/product/_search?pretty' -d '{
  "query": { 
    "filtered": {
      "query": {"query_string" :{"query" :"blue"}},
      "filter" : { "terms" : {"categories" : ["shoes"]} }}},
  "aggs" : {
        "category_agg" : { 
           "terms" : { "field" : "categories" } ,
           "aggs" : {
             "shoesize_agg" : { "terms" : { "field" : "shoesize" } },
             "lacecolor_agg" : { "terms" : { "field" : "lacecolor" } }
           }
        }
    }
}'