Elasticsearch获得n个有序记录,然后应用分组

时间:2016-02-01 15:04:29

标签: elasticsearch

这是我正在寻找的一个例子。假设我有一些购买记录。我想得到价格> 1的记录。 50美元,按价格降序排列。我想将这些有序记录限制为100,然后按邮政编码对它们进行分组。

最终结果应该包含每个邮编的点击次数,其中这些计数的总和将达到100个记录。

ES v2.1.1

2 个答案:

答案 0 :(得分:1)

您需要使用Search API获取100个结果,然后进行后处理以执行聚合(因为无法使用ES API直接完成热门命中的聚合)。

  • "我想获得价格为>的记录$ 50#34; - 您需要range filter
  • " ...按价格下降排序" - 您需要sort
  • "我想将这些有序记录限制为100" - 你需要指定 尺寸参数。
  • " ...然后按邮政编码对其进行分组" - 你需要后期处理"点击":"点击"用于执行此操作的数组(例如,插入带有邮政编码作为键值的哈希表/字典)。

对于步骤1-3,您需要:

    $ curl -XGET 'http://localhost:9200/my_index/_search?pretty' -d '{"query":  
       {"filtered" : {"filter" : { "range": { "price": { "gt": 50 }}}}},

    "size" : 100,

    "sort": { "price": { "order": "desc" }}
    }'

答案 1 :(得分:1)

你是什么意思“按邮政编码分组”:

  1. 只是想知道小组中的文档数量?
  2. 带有邮政编码的哈希作为与docs相关联的密钥?
  3. 如果1:

    {
        "size": 100,
        "query": {
            "filtered": {
                "filter": {
                    "range": {
                        "price": {
                            "gt": 50
                        }
                    }
                }
            }
        },
        "sort": {
            "price": "desc"
        },
        "aggs": {
            "by_zip_code": {
                "terms": {
                    "field": "zip_code"
                }
            }
        }
    }
    

    如果为2,您可以使用top hits aggregations。但是,按价格排序是不可能的(我们怎么能这样做?),默认情况下,Elasticsearch使用_count(检查intrinsic sorts)。如果排序不是很重要,以下内容将起作用:

    {
        "size": 0,
        "query": {
            "filtered": {
                "filter": {
                    "range": {
                        "price": {
                            "gt": 50
                        }
                    }
                }
            }
        },
        "sort": {
            "price": "desc"
        },
        "aggs": {
            "by_zip_code": {
                "terms": {
                    "field": "zip_code",
                    "size": 100
                },
                "aggs": {
                    "hits": {
                        "top_hits": {}
                    }
                }
            }
        }
    }