【问题标题】:How to get aggs in elasticsearch-dsl-py如何在 elasticsearch-dsl-py 中获取 aggs
【发布时间】:2016-03-27 23:19:44
【问题描述】:

如何获得聚合结果?

我的代码是:

s = Items.search() #Items is DSL class
s.aggs.bucket('SP', 'terms', item=item_name).metric('max_amt', 'max', field='amount')
res = s.execute()

尝试此操作时,我收到以下错误:

    ERROR:django.request:Internal Server Error: /items/
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/shipra/codeengine/items/ES/items_views.py", line 38, in sell_items
    res = s.execute()
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch_dsl/search.py", line 573, in execute
    **self._params
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/__init__.py", line 530, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.py", line 307, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/http_urllib3.py", line 93, in perform_request
    self._raise_error(response.status, raw_data)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/base.py", line 105, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
RequestError: TransportError(400, u'search_phase_execution_exception')

【问题讨论】:

    标签: python elasticsearch aggregation elasticsearch-dsl elasticsearch-py


    【解决方案1】:

    你快到了,你不需要将s 引用重新分配给aggs.bucket 调用的结果(即不需要a 变量),只需这样做:

    s = Items.search() #Items is DSL class
    s.aggs.bucket('SP', 'terms', field=item_name).metric('max_amt', 'max', field='amount')
    res = s.execute()              ^
                                   |
                + change this to "field" instead of "item"
    
    # do something with the aggs
    for term in response.aggregations.SP.buckets:
        print(term.key, term.max_amt.value)
    

    【讨论】:

    • 按照您的方式操作时出现传输错误。 raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info) RequestError: TransportError(400, u'search_phase_execution_exception')
    • 有趣,你能用你得到的完整错误更新你的问题吗?查询现在正在生成和发送,所以现在可能是其他问题。
    • 您的查询中有错字(即field= 而不是item=),请查看我的更新答案。
    • 您越来越像所有项目的最大值(而非平均值)。随时针对过滤器问题发布一个新问题,这样我们就不会在同一个问题上塞进太多内容。
    • 上述查询工作正常,但是当我执行以下操作时,我得到了属性错误。 >>> s = s.aggs.bucket('SP', 'terms', field='colour') >>> res = s.execute() AttributeError: 'Terms' object has no attribute 'execute'
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2018-12-17
    • 2019-04-26
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多