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

Mav*_*ave 1 aggregation elasticsearch

我对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>
Run Code Online (Sandbox Code Playgroud)

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

要显示每个选定类别的过滤器,搜索将类似于以下内容:

curl -XPOST "http://localhost:9200/products/_search" -d'
{
  "size": 0, 
  "aggregations": {
    "filter": {
      "term": { "category": "Shoes"
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

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

我很困难,到目前为止,我发现的资源都没有帮助我.新手文档确实缺乏.

Oll*_*ank 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"
 }'  
Run Code Online (Sandbox Code Playgroud)

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

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" } }
           }
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

如果你想对聚合进行过滤 - 例如因为用户搜索了特定的术语或选择了一个类别,我会将该标准放在查询语句中(即不是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" } }
           }
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)